まずは categories
テーブルの一覧を表示するカテゴリー一覧表示機能の開発に着手します。ここでは以下の手順にしたがってプログラムを作成します。
- カテゴリー一覧画面の作成 -
index.php
- エラー画面の作成 -
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が停止しているなど、データベースとの接続で例外がスローされた場合にエラー画面が表示されるようになります。