PHPでCRUD操作!一覧ページに新規登録・詳細・編集・削除リンクを実装

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.phpedit.phpなど、個別のページからは、いつでも一覧ページに戻れるようにリンクを設置しておくと、ユーザーにとって親切な設計になります。

記述例:

<a href="index.php">一覧に戻る</a>

まとめ

  • アプリケーションの中心となる一覧ページ (index.php) は、データの表示(Read)と、他の機能(Create, Update, Delete)へのハブの役割を担う。
  • foreachループの中で、各レコードの**ユニークなid**をURLパラメータに含めることで、特定のレコードを対象とした操作ページへリンクできる。
  • URLに動的な値を含める際も、**htmlspecialchars()**によるエスケープを忘れないようにする。

これで、あなたのWebアプリケーションは、単なる情報の表示機能だけでなく、ユーザーがデータを自在に操作するための基本的な骨格を持つことができました。各リンク先のページを一つずつ作成していくことで、アプリケーションが完成に近づいていきます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次