Webアプリケーション開発において、一度登録したデータを後から編集・更新する機能は、ユーザー情報の変更やブログ記事の修正など、あらゆる場面で必須となります。
データの更新処理(CRUDにおけるUpdate)は、一般的に以下の2つのページを連携させて実現します。
- 編集フォーム (
edit.php): データベースから既存のデータを読み込み、編集可能なフォームとして表示するページ。 - 更新処理スクリプト (
update.php): 編集フォームから送信されたデータを受け取り、データベースにUPDATE命令を実行するページ。
この記事では、この一連の流れを追いながら、PHP(PDO)を使って安全にデータベースを更新する方法を解説します。
1. Step 1: 編集フォームの作成 (edit.php)
まず、ユーザーがデータを編集するためのフォームを用意します。このページは、どのレコードを編集するのかを知るために、URLのGETパラメータでidを受け取ります。(例: edit.php?id=3)
edit.phpの主な処理の流れ:
- URLから
idを受け取り、バリデーションを行う。 - 受け取った
idを基に、データベースから該当する1件のレコードをSELECT文で取得する。 - 取得したデータを、HTMLフォームの各入力欄の
value属性などにあらかじめ表示(プリセット)しておく。 - フォーム送信時に、どのレコードを更新するのかを伝えるため、
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の主な処理の流れ:
- POSTで送信されたデータ(書籍名、評価、そしてhiddenで送られた
id)を受け取る。 - 受け取ったデータ、特に
idが正しい形式であるかをバリデーションする。 UPDATE文のプリペアドステートメントを準備する。- 受け取った値をプレースホルダにバインドし、
execute()でSQLを実行する。 - 処理が完了したら、一覧ページなどにリダイレクト(転送)する。
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段階のプロセスで行うのが基本です。
- 編集フォーム (
edit.php):GETでIDを受け取り、既存のデータをSELECTしてフォームに表示する。更新対象のidはhiddenフィールドでPOST送信する。 - 更新処理 (
update.php):POSTでデータとidを受け取り、バリデーションを行う。UPDATE文のWHERE句でidを指定し、レコードを更新する。
特に、更新・削除処理におけるWHERE句の条件指定は、意図しないデータ破壊を防ぐための命綱です。プリペアドステートメントを活用し、安全で確実な更新処理を実装しましょう。
