PHPでデータベースを更新する方法!UPDATE文と編集フォームの実装

Webアプリケーション開発において、一度登録したデータを後から編集・更新する機能は、ユーザー情報の変更やブログ記事の修正など、あらゆる場面で必須となります。

データの更新処理(CRUDにおけるUpdate)は、一般的に以下の2つのページを連携させて実現します。

  1. 編集フォーム (edit.php): データベースから既存のデータを読み込み、編集可能なフォームとして表示するページ。
  2. 更新処理スクリプト (update.php): 編集フォームから送信されたデータを受け取り、データベースにUPDATE命令を実行するページ。

この記事では、この一連の流れを追いながら、PHP(PDO)を使って安全にデータベースを更新する方法を解説します。


目次

1. Step 1: 編集フォームの作成 (edit.php)

まず、ユーザーがデータを編集するためのフォームを用意します。このページは、どのレコードを編集するのかを知るために、URLのGETパラメータでidを受け取ります。(例: edit.php?id=3

edit.phpの主な処理の流れ:

  1. URLからidを受け取り、バリデーションを行う。
  2. 受け取ったidを基に、データベースから該当する1件のレコードをSELECT文で取得する。
  3. 取得したデータを、HTMLフォームの各入力欄のvalue属性などにあらかじめ表示(プリセット)しておく。
  4. フォーム送信時に、どのレコードを更新するのかを伝えるため、id<input type="hidden">に含めてupdate.phpに送信する。

edit.phpのサンプルコード:

<?php
// (データベース接続処理は省略... $pdoに接続済みオブジェクトがあると仮定)
// URLからidを取得し、バリデーションとキャストを行う
if (empty($_GET['id']) || !ctype_digit($_GET['id'])) {
    exit('IDが不正です。');
}
$id = (int)$_GET['id'];

// idを基にレコードを1件取得
$stmt = $pdo->prepare("SELECT * FROM reviews WHERE id = ?");
$stmt->execute([$id]);
$review = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$review) {
    exit('対象のデータが見つかりません。');
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>レビュー編集</title>
</head>
<body>
    <h1>レビュー編集フォーム</h1>
    <form action="update.php" method="post">
        <input type="hidden" name="id" value="<?php echo htmlspecialchars($review['id'], ENT_QUOTES, 'UTF-8'); ?>">
        <p>
            書籍名: <input type="text" name="book_title" value="<?php echo htmlspecialchars($review['book_title'], ENT_QUOTES, 'UTF-8'); ?>">
        </p>
        <p>
            評価: <input type="number" name="rating" min="1" max="5" value="<?php echo htmlspecialchars($review['rating'], ENT_QUOTES, 'UTF-8'); ?>">
        </p>
        <input type="submit" value="更新">
    </form>
</body>
</html>

2. Step 2: 更新処理スクリプトの作成 (update.php)

次に、edit.phpのフォームから送信されたデータを受け取り、データベースを更新するupdate.phpを作成します。

update.phpの主な処理の流れ:

  1. POSTで送信されたデータ(書籍名、評価、そしてhiddenで送られたid)を受け取る。
  2. 受け取ったデータ、特にidが正しい形式であるかをバリデーションする。
  3. UPDATE文のプリペアドステートメントを準備する。
  4. 受け取った値をプレースホルダにバインドし、execute()でSQLを実行する。
  5. 処理が完了したら、一覧ページなどにリダイレクト(転送)する。

UPDATE文のWHERE句で更新対象のidを指定し忘れると、テーブルの全データが更新されてしまうため、idの受け渡しとWHERE句の記述は特に重要です。


3. 完成版コード (update.php)

バリデーションやエラー処理を含めた、update.phpの完全なサンプルコードです。

update.phpのサンプルコード:

<?php
// --- データベース接続設定 ---
$dsn = 'mysql:host=localhost;dbname=my_first_db;charset=utf8mb4';
$user = 'root';
$password = 'root';

// --- フォームからのデータ受け取りとバリデーション ---
try {
    // IDのバリデーション
    if (empty($_POST['id']) || !ctype_digit($_POST['id'])) {
        throw new Exception('IDが不正です。');
    }
    $id = (int)$_POST['id'];
    
    // その他のPOSTデータの取得と型キャスト
    $book_title = $_POST['book_title'];
    $rating = (int)$_POST['rating'];

    // 簡単なバリデーション
    if (empty($book_title)) {
        throw new Exception('書籍名を入力してください。');
    }

    // --- データベース更新処理 ---
    $pdo = new PDO($dsn, $user, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    // UPDATE文のプリペアドステートメントを準備
    $sql = "UPDATE reviews SET book_title = ?, rating = ? WHERE id = ?";
    $stmt = $pdo->prepare($sql);

    // 値をバインドして実行
    $stmt->execute([$book_title, $rating, $id]);
    
    // 処理完了後に一覧ページへリダイレクト
    header('Location: list.php');
    exit();

} catch (Exception $e) {
    // エラー発生時の処理
    echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');
    die();
}
?>

まとめ

データベースの更新処理は、以下の2段階のプロセスで行うのが基本です。

  1. 編集フォーム (edit.php): GETでIDを受け取り、既存のデータをSELECTしてフォームに表示する。更新対象のidhiddenフィールドでPOST送信する。
  2. 更新処理 (update.php): POSTでデータとidを受け取り、バリデーションを行う。UPDATE文のWHERE句でidを指定し、レコードを更新する。

特に、更新・削除処理におけるWHERE句の条件指定は、意図しないデータ破壊を防ぐための命綱です。プリペアドステートメントを活用し、安全で確実な更新処理を実装しましょう。

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

この記事を書いた人

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

目次