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
句の条件指定は、意図しないデータ破壊を防ぐための命綱です。プリペアドステートメントを活用し、安全で確実な更新処理を実装しましょう。