前回は概要設計について説明しました。

各ファイルの使い方
今回から本格的にコードを書いていきます。
エディターに指定はありませんが、画面はVisualStudioCode(VSCode)を使用しています。
ダウンロードしたソースコードにはindex.php(初期状態)のファイルとcomplete.php(完成品)があります。index.phpに記述を加えていき、わからなくなったらcomplete.phpと比較していただければと思います。
画面遷移
まずindex.phpの先頭に次のPHPのコードを加えます。
今回は同じファイルでGETリクエストとPOSTリクエストを受けますので明確に処理をかき分けるために条件分岐を加えておきます。
index.php
<?php if($_SERVER['REQUEST_METHOD']==="POST"){ //POSTリクエスト時の処理 }else{ //GETリクエスト時の処理 } ?> <!doctype html> <html lang="ja">
GETリクエスト時の処理
まずGETの処理から記述していきます。
コメントを書き加えて、まず何をするか明確にしていくと良いでしょう。
index.php
<?php if($_SERVER['REQUEST_METHOD']==="POST"){ //POSTリクエスト時の処理 }else{ //GETリクエスト時の処理 //一覧表示用の配列を宣言 //DBにアクセスして登録済データを投稿の新しい順に取得 //Messageオブジェクトに格納、配列に追加 } ?>
Messageクラスの定義
データベースから取得したデータを格納するMessageオブジェクトを定義するクラスファイルを作成します。こういった処理は連想配列を使うケースもありますが、オブジェクト化することでより堅牢なプログラムになります。
Message.php
<?php class Message { private $user_name; private $user_email; private $main; private $created_at; public function __construct(string $user_name, string $user_email, string $main, string $created_at) { $this->user_name = $user_name; $this->user_email = $user_email; $this->main = $main; $this->created_at = $created_at; } public function get_user_name(): string { return $this->user_name; } public function get_user_email(): string { return $this->user_email; } public function get_main(): string { return $this->main; } public function get_created_at(): string { return $this->created_at; } }
PHP7.0からサポートされたスカラー型宣言を使用して引数のデータ型、戻り値のデータ型を指定しています。本来は日時型のcreated_atがstringなのはスカラー型として指定出来ないためです。
もちろん型指定しなくても動作はしますが、実行時の誤動作を防ぐ意味でも積極的にデータ型を指定する習慣をつけた方がいいでしょう。
データベースから登録済み発言を取得
env.php
データベースに接続するための情報を設定ファイルにまとめます。(env.php)
設定ファイルを別にしておくことで開発環境と本番環境を容易に切り替えることが可能です。
<?php define('DSN', 'mysql:host=localhost:3306;dbname=bbs;charset=utf8'); define('DB_USER', 'dbuser'); define('DB_PASS', 'passwd');
index.php
処理部分
<?php //関連ファイルのインポート require_once ('./Message.php'); require_once ('./env.php'); if($_SERVER['REQUEST_METHOD']==="POST"){ //POSTリクエスト時の処理 }else{ //GETリクエスト時の処理 //一覧表示用の配列を宣言 $message_list = array(); try{ //DBにアクセスして登録済データを投稿の新しい順に取得 $pdo = new PDO(DSN, DB_USER, DB_PASS); $msgs = $pdo->query( "SELECT * FROM messages ORDER BY id DESC" ); //Messageオブジェクトに格納、配列に追加 foreach($msgs as $msg){ $message = new Message($msg['user_name'],$msg['user_email'],$msg['main'],$msg['created_at']); array_push($message_list,$message); } }catch(PDOEXception $e){ print("DBに接続できませんでした。"); die(); } } ?>
表示部分
<!--表示部分--> <div class="container"> <?php foreach($message_list as $message){ ?> <div class="alert alert-primary" role="alert"> <p><?=$message->get_main() ?></p> <p class="text-right"><?=$message->get_user_name() ?>(<?=$message->get_created_at()?>)</p> </div> <?php } ?> </div>
コード全体の表示はcomplete.phpを参照してください。
実行結果
ブラウザーでindex.phpを確認すると次のようになるはずです。
確認用にインサートしたデータが表示されていれば成功です。
次回はメッセージの投稿部分を制作します。
