Webアプリケーション開発の基本は、データのCreate(作成)、Read(読み取り)、Update(更新)、Delete(削除)という4つの操作、通称「CRUD」を実装することです。
これまでの記事で個別に学んできた各機能を、アプリケーションの「顔」となるトップページ(一覧ページ)からスムーズに呼び出せるように繋ぎこんでいきましょう。
この記事では、データベースから取得したデータを一覧表示し、さらに各データに対して「詳細」「編集」「削除」の操作リンクを動的に生成する方法を解説します。
1. CRUDアプリケーションのファイル構成
まず、私たちの小さなWebアプリケーションがどのようなファイルで構成されるか、全体像を整理してみましょう。
index.php
: (R)ead – 全てのデータを一覧表示するトップページ。form.php
: (C)reate – 新規データを登録するための入力フォームページ。insert.php
:form.php
からデータを受け取り、データベースにINSERT
する処理。detail.php
: (R)ead – 1件のデータを詳しく表示するページ。edit.php
: (U)pdate – 既存のデータを編集するためのフォームページ。update.php
:edit.php
からデータを受け取り、データベースをUPDATE
する処理。delete.php
: (D)elete – 1件のデータを削除する処理。
今回は、これらのファイル群の中心となるindex.php
を完成させます。
2. 一覧ページに各機能へのリンクを追加する
一覧表示された各レコード(各レビュー)に対して、「どのレビューの詳細を見たいのか」「どのレビューを編集したいのか」をプログラムに伝える必要があります。そのために、URLのGETパラメータを使って各レコード固有のid
を渡します。
foreach
ループの中で各レコードのデータを表示する際に、そのレコードのid
($review['id']
)を使って、detail.php
, edit.php
, delete.php
へのリンクを動的に生成します。
リンク生成のポイント:
- 詳細ページへ:
<a href="detail.php?id=...">
- 編集ページへ:
<a href="edit.php?id=...">
- 削除処理へ:
<a href="delete.php?id=...">
これらの...
の部分に、ループ中の現在のレコードのid
をPHPで埋め込んでいきます。
3. 完成版コード (index.php
)
それでは、データベース接続からデータ取得、そして各機能へのリンクを含むHTMLテーブルの生成まで、全ての処理を実装したindex.php
の完全なコードを見てみましょう。
index.php
のサンプルコード:
<?php
// --- データベース接続設定 ---
$dsn = 'mysql:host=localhost;dbname=my_first_db;charset=utf8mb4';
$user = 'root';
$password = 'root'; // ご自身の環境に合わせて変更
try {
// データベースへの接続
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// 全てのレビューを新しい順に取得するSQL
$sql = "SELECT id, book_title, rating FROM reviews ORDER BY created_at DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
$reviews = $stmt->fetchAll(PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo "接続失敗: " . $e->getMessage();
exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>読書レビュー一覧</title>
<style>
body { font-family: sans-serif; }
table { width: 100%; border-collapse: collapse; }
th, td { border: 1px solid #ddd; padding: 8px; }
th { background-color: #f2f2f2; }
.actions a { margin-right: 10px; }
.new-link { display: inline-block; margin-bottom: 15px; }
</style>
</head>
<body>
<h1>読書レビュー一覧</h1>
<a href="form.php" class="new-link">新規登録</a>
<table>
<thead>
<tr>
<th>書籍名</th>
<th>評価</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<?php foreach ($reviews as $review): ?>
<tr>
<td><?php echo htmlspecialchars($review['book_title'], ENT_QUOTES, 'UTF-8'); ?></td>
<td><?php echo htmlspecialchars($review['rating'], ENT_QUOTES, 'UTF-8'); ?></td>
<td class="actions">
<a href="detail.php?id=<?php echo htmlspecialchars($review['id'], ENT_QUOTES, 'UTF-8'); ?>">詳細</a>
<a href="edit.php?id=<?php echo htmlspecialchars($review['id'], ENT_QUOTES, 'UTF-8'); ?>">編集</a>
<a href="delete.php?id=<?php echo htmlspecialchars($review['id'], ENT_QUOTES, 'UTF-8'); ?>">削除</a>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</body>
</html>
他のページからトップページへ戻るリンク
detail.php
やedit.php
など、個別のページからは、いつでも一覧ページに戻れるようにリンクを設置しておくと、ユーザーにとって親切な設計になります。
記述例:
<a href="index.php">一覧に戻る</a>
まとめ
- アプリケーションの中心となる一覧ページ (
index.php
) は、データの表示(Read)と、他の機能(Create, Update, Delete)へのハブの役割を担う。 foreach
ループの中で、各レコードの**ユニークなid
**をURLパラメータに含めることで、特定のレコードを対象とした操作ページへリンクできる。- URLに動的な値を含める際も、**
htmlspecialchars()
**によるエスケープを忘れないようにする。
これで、あなたのWebアプリケーションは、単なる情報の表示機能だけでなく、ユーザーがデータを自在に操作するための基本的な骨格を持つことができました。各リンク先のページを一つずつ作成していくことで、アプリケーションが完成に近づいていきます。