職業訓練生のためのPHPチュートリアル(3) リクエストGETで一覧表示

 

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

職業訓練生のためのPHPチュートリアル(2) 概要と設計
前回は環境設定について説明しました。 概要と設計 このチュートリアルで作成するプログラムは伝言板(掲示板)です。PHPアプリケーションの仕組みを理解することが主目的ですので機能は最小限に留めています。 一つのhtmlの中に投稿用のフォームと...

各ファイルの使い方

今回から本格的にコードを書いていきます。
エディターに指定はありませんが、画面は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なのはスカラー型として指定出来ないためです。

もちろん型指定しなくても動作はしますが、実行時の誤動作を防ぐ意味でも積極的にデータ型を指定する習慣をつけた方がいいでしょう。

PHPコードで終了するプログラムでは?>の閉じる記号は省略可能です。

データベースから登録済み発言を取得

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を確認すると次のようになるはずです。

実行結果

確認用にインサートしたデータが表示されていれば成功です。

次回はメッセージの投稿部分を制作します。

職業訓練生のためのPHPチュートリアル(4) リクエストPOSTで登録
前回はHTTPリクエストメソッドがGETの場合、一覧表示をする部分を制作しました。 今回はリクエストメソッドがPOSTの場合はデータベースに登録する部分に取り掛かります。 POSTリクエスト時の処理 POSTリクエスト時の処理をコメントで記...
タイトルとURLをコピーしました