はじめに
データベースを使ってコンテンツを表示するページを作りたいと、友人(@digital24s さん)から相談されました。PHP プログラムで MySQL に接続して操作する仕組を整理しました。
ウェブアプリでデータベースを操作する #PHP - Qiita
その続きです。
データベースに接続して SSR で表示する
前回の記事のウェブアプリは、フロントエンドプログラムがデータを表示する、いわゆる「CSR(Client Side Rendering)」のプログラムでした。
これに対して、PHP で書かれるウェブアプリのプログラムは、「SSR(Server Side Rendering)」にすることが多いかも知れません。
参考 レンダリングパターンをいらすとやで解説してみた #AdventCalendar - Qiita
「SSR」のウェブアプリは、フロントエンドで表示するための HTML データをバックエンドプログラムが作成します。画面を更新するときは、HTML データを作成し直して入替します。
前回の記事のデータベースに接続して一覧表示するプログラムを、SSR で書換したいと思います。
SSR で一覧表示する
参考 PHPでデータベースのデータを取得し、HTMLのテーブルで一覧表示する方法 - 森の株
HTML データの雛形の中に、PHP のコードを書いていきます。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<?php
try {
// データベースに接続
$pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
// データを取得
$stmt = $pdo->query("SELECT actor_id, first_name, last_name, last_update FROM actor");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 処理が成功したことを返す
$message = "Succeeded.";
}
catch (Throwable $e) {
// エラー発生したことを返す
$message = "Failed: " . $e->getMessage();
}
?>
<body>
<p><?= $message ?></p>
<ul>
<?php foreach ($rows as $item): ?>
<li>
(<?= $item['actor_id'] ?>) <?= $item['first_name'] ?> <?= $item['last_name'] ?>
</li>
<?php endforeach; ?>
</ul>
</body>
</html>
データベースに接続してデータを取得して変数 $rows にセットします。これを HTML タグに仕込んだ PHP コードで表示します。↑
ボタン押下したら一覧表示する
上記のプログラムは、ウェブブラウザでページが開かれた時点でデータを取得して一覧表示します。ページを開いたときは一覧表示しないで、ボタン押下すると一覧表示するようにしたいと思います。
参考 PHPで検索フォームを作るには?簡単な検索機能を実装してみよう! | 侍エンジニアブログ
(前略)
<body>
<p><?= $message ?></p>
<form method="GET" action="ssr.php">
<button type="submit" name="action" value="list">取得</button>
</form>
(後略)
form と button を用意して、ボタン押下するとパラメータ action に「list」をセットして、自分自身 ssr.php を呼出し直すようにします。↑
<?php
try {
// 指定されたパラメータを取得
$action = $_GET['action'] ?? '';
if ($action === "list") {
// データベースに接続
$pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
// データを取得
$stmt = $pdo->query("SELECT actor_id, first_name, last_name, last_update FROM actor");
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
}
(後略)
PHP スクリプトが呼出されたとき、指定されたパラメータ action を確認します。「list」が指定されていたら、データベースから取得するようにします。↑
最初に ssr.php が呼出されるときは、パラメータの指定なしで、変数 $rows は内容がセットされないので、画面に一覧表示されなくなります。
条件を指定して一覧表示する
上記のプログラムはテーブルに登録されている全てのデータを取得して表示しています。条件を指定して一致したデータを取得して表示するようにしたいと思います。
参考 PHPのパラメータはこれで解決!値送信から取得まで解説 | 侍エンジニアブログ
(前略)
<form method="GET" action="ssr.php">
<input type="text" name="keyword" placeholder="キーワード" value="<?= $keyword ?>">
<button type="submit" name="action" value="find">検索</button>
</form>
(後略)
名前 keyword の input タグを追加する。action は「find」にしました。↑
(前略)
// 指定されたパラメータを取得
$action = $_GET['action'] ?? '';
if ($action === "find") {
// 指定されたパラメータを取得
$keyword = $_GET['keyword'] ?? '';
// データベースに接続
$pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
// データを取得
$stmt = $pdo->prepare("SELECT actor_id, first_name, last_name, last_update FROM actor "
. "WHERE first_name LIKE :keyword OR last_name LIKE :keyword");
$stmt->bindValue(':keyword', "%{$keyword}%", PDO::PARAM_STR);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
(後略)
パラメータ action に「find」が指定されていたら、パラメータ keyword を確認して
データベースから取得します。↑
登録と削除できるようにする
続いて、データを「登録」「削除」できるようにしたいと思います。
(前略)
<form method="POST" action="ssr.php">
<input type="text" name="actor_id" placeholder="ID (空なら新規、既存なら更新)">
<input type="text" name="first_name" placeholder="First Name">
<input type="text" name="last_name" placeholder="Last Name">
<button type="submit" name="action" value="regist">登録・更新</button>
<button type="submit" name="action" value="remove">削除</button>
</form>
(後略)
パラメータ action が「regist」のとき「新規登録」と「更新登録」します。「remove」のとき「削除」します。form タグに名前 action_id などの input タグを追加します。↑
(前略)
if ($action === "regist") {
// 指定されたパラメータを取得
$actorId = $_POST['actor_id'] ?? null;
$firstName = $_POST['first_name'] ?? '';
$lastName = $_POST['last_name'] ?? '';
// データベースに接続
$pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
// データを挿入/更新
$stmt = $pdo->prepare("INSERT INTO actor (actor_id, first_name, last_name, last_update) VALUES (:actor_id, :first_name, :last_name, NOW()) "
. "ON DUPLICATE KEY UPDATE first_name = VALUES(first_name), last_name = VALUES(last_name), last_update = NOW()");
$stmt->bindValue(':actor_id', $actorId, PDO::PARAM_INT);
$stmt->bindValue(':first_name', $firstName, PDO::PARAM_STR);
$stmt->bindValue(':last_name', $lastName, PDO::PARAM_STR);
$stmt->execute();
// 処理が成功したことを返す
$message = "Registered.";
}
else if ($action === "remove") {
// 指定されたパラメータを取得
$actorId = $_POST['actor_id'] ?? null;
// データベースに接続
$pdo = new PDO("mysql:host=(ホスト); dbname=sakila", "(ユーザ)", "(パスワード)");
// データを削除
$stmt = $pdo->prepare("DELETE FROM actor WHERE actor_id = :actor_id");
$stmt->bindValue(':actor_id', $actorId, PDO::PARAM_INT);
$stmt->execute();
// 処理が成功したことを返す
$message = "Deleted.";
}
(後略)
