まずは categories テーブルの一覧を表示するカテゴリー一覧表示機能の開発に着手します。ここでは以下の手順にしたがってプログラムを作成します。

  1. カテゴリー一覧画面の作成 - index.php
  2. エラー画面の作成 - error.php

2つのファイルは categories フォルダ内に配置します。

1. カテゴリー一覧画面の作成 - index.php

index.php という名前のファイルを作成して、以下のプログラムを記述します。

<?php
try {
    $dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
    $username = "root";
    $password = "admin";
    $options = [
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false
    ];
    $pdo = new PDO($dsn, $username, $password);

    $sql = "select id, title from categories order by id";
    $ps = $pdo->prepare($sql);
    $ps->execute();
    $categories = $ps->fetchAll();
} catch (PDOException $e) {
    error_log("PDOException: " . $e->getMessage());
    header("Location: error.php");
    exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PHP DB</title>
</head>
<body>
  <h3>Categories - Index</h3>
  <hr>
  <table border="1">
    <tr>
      <th>ID</th>
      <th>TITLE</th>
    </tr>
    <?php foreach ($categories as $category) { ?>
    <tr>
      <td><?= htmlspecialchars($category["id"]) ?></td>
      <td><?= htmlspecialchars($category["title"]) ?></td>
    </tr>
    <?php } ?>
  </table>
</body>
</html>

作成したプログラムについて見ていきましょう。

このプログラムでは先頭部分で try - catch 文を定義してPDOインスタンスを生成しています。PDOインスタンスを生成することでデータベースとの接続します。

    $dsn = "mysql:host=localhost;dbname=eldb;charset=utf8mb4";
    $username = "root";
    $password = "admin";
    $options = [
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_EMULATE_PREPARES => false
    ];
    $pdo = new PDO($dsn, $username, $password);

次にプリペアドステートメントを使って select 文を実行し、実行結果を2次元配列でフェッチしています。

    $sql = "select id, title from categories order by id";
    $ps = $pdo->prepare($sql);
    $ps->execute();
    $categories = $ps->fetchAll();

ここで取得した変数 $categories を後のHTMLの table の中で出力しています。

  <table border="1">
    <tr>
      <th>ID</th>
      <th>TITLE</th>
    </tr>
    <?php foreach ($categories as $category) { ?>
    <tr>
      <td><?= htmlspecialchars($category["id"]) ?></td>
      <td><?= htmlspecialchars($category["title"]) ?></td>
    </tr>
    <?php } ?>
  </table>

またデータベースとの接続で例外(PDOException)が発生した場合は catch ブロックの処理が実行されます。

} catch (PDOException $e) {
    error_log("PDOException: " . $e->getMessage());
    header("Location: error.php");
    exit();
}

ここでは error_log 関数を使って例外メッセージをエラーログに出力しています。

デフォルトの設定の場合 error_log 関数はビルトインWebサーバの起動ログにエラーログを出力します。

また header 関数を使ってエラー画面である error.php にリダイレクトしています。 error.php ファイルについてはこれから作成します。それから最後に exit 関数を呼び出して処理を終了しています。

exit 関数を呼び出すとPHPプログラムはそこで処理を終了するようになっています。つまり、後のHTML出力は実行されない、ということになります。

2. エラー画面の作成 - error.php

続いてアプリケーション内の共通エラー画面である error.php ファイルを作成します。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>PHP DB</title>
</head>
<body>
  <h3>Categories - Error</h3>
  <hr>
  <a href="index.php">BACK</a>
</body>
</html>

error.php ファイルはHTMLの出力のみを定義しています。画面には Categories - Error というタイトルとカテゴリー一覧画面への BACK リンクを表示します。

動作確認

それではビルトインWebサーバを起動して、ブラウザから実行結果を確認してみましょう。

コマンドラインからビルトインWebサーバを起動します。

$ php -S localhost:8080

ブラウザから以下のURLにアクセスします。

https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/categories/index.php

URLに categories とフォルダ名を含む点に注意してください。

上記のようにカテゴリー一覧画面が表示されることを確認します。

それからエラー画面についても確認しておきましょう。ブラウザから以下のURLにアクセスします。

https://〜.vfs.cloud9.ap-northeast-1.amazonaws.com/categories/error.php

上記のようにエラー画面が表示されることを確認します。

ここではエラー画面にアクセスしていますが、実際にはMySQLが停止しているなど、データベースとの接続で例外がスローされた場合にエラー画面が表示されるようになります。