Webアプリケーション開発において、データの登録(Create)、読み取り(Read)、削除(Delete)と並んで中核となるのが、**更新(Update)**機能です。一度登録したブログ記事の誤字を修正したり、ユーザー情報を変更したりと、あらゆる場面で必要になります。
この更新機能は、一般的に以下の2つのステップで実装されます。
- 編集フォーム (
edit.php
): データベースから既存のデータを取得し、編集可能なフォームにその内容を初期値として表示する。 - 更新処理 (
update.php
): 編集フォームから送信されたデータを受け取り、データベース内の該当レコードを新しい内容で上書きする。
この記事では、この2つのプログラムを作成し、データの更新機能を完成させるまでの一連の流れを解説します。
目次
1. 既存データを表示する編集フォームの作成 (edit.php
)
編集フォームの役割は、詳細ページ(detail.php
)と入力フォーム(form.html
)を組み合わせたようなものです。URLから受け取ったIDを元にデータベースからデータを取得し、その内容をvalue
属性などを使って各フォーム部品にセットします。
edit.php
のサンプルコード:
<?php
// (データベース接続設定 $dsn, $user, $password は定義済みと仮定)
$review = null;
try {
// URLからIDをバリデーションして取得
if (empty($_GET['id']) || !ctype_digit($_GET['id'])) {
throw new Exception('IDが不正です。');
}
$id = (int)$_GET['id'];
// データベースに接続
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// IDを元にレコードを1件取得
$sql = "SELECT * FROM reviews WHERE id = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$id]);
$review = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$review) {
throw new Exception('指定されたレビューは見つかりません。');
}
} catch (Exception $e) {
// エラー発生時はエラーメッセージを表示して処理を停止
echo "エラー: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');
die();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>レビュー編集フォーム</title>
</head>
<body>
<h1>レビュー編集</h1>
<form method="post" action="update.php">
<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="radio" name="rating" value="1" <?php if ($review['rating'] === 1) echo "checked"; ?>> 1
<input type="radio" name="rating" value="2" <?php if ($review['rating'] === 2) echo "checked"; ?>> 2
<input type="radio" name="rating" value="3" <?php if ($review['rating'] === 3) echo "checked"; ?>> 3
<input type="radio" name="rating" value="4" <?php if ($review['rating'] === 4) echo "checked"; ?>> 4
<input type="radio" name="rating" value="5" <?php if ($review['rating'] === 5) echo "checked"; ?>> 5
</p>
<p>
感想:<br>
<textarea name="review_text" cols="40" rows="5"><?php echo htmlspecialchars($review['review_text'], ENT_QUOTES, 'UTF-8'); ?></textarea>
</p>
<p><input type="submit" value="更新する"></p>
</form>
</body>
</html>
コードのポイント:
value
属性:<input type="text">
などでは、value
属性にPHPで取得した値をecho
することで初期値を設定します。checked
/selected
属性: ラジオボタンやセレクトボックスでは、if
文を使ってDBの値と一致する場合にchecked
やselected
という属性を出力し、保存されていた項目をデフォルトで選択状態にします。type="hidden"
: どのレコードを更新するのかを次のupdate.php
に伝えるため、id
を非表示のフォーム部品として送信します。これは非常に重要です。
2. データベースを更新する処理スクリプトの作成 (update.php
)
edit.php
のフォームから送信されたデータを受け取り、UPDATE
文を実行してデータベースの内容を上書きします。処理の流れは、新規登録(add.php
)と似ていますが、WHERE
句で更新対象のIDを指定する点が異なります。
update.php
のサンプルコード:
<?php
// POSTリクエスト以外は処理を中断
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
exit('不正なリクエストです。');
}
// (データベース接続設定は定義済みと仮定)
try {
// --- バリデーションと型変換 ---
if (empty($_POST['id']) || !ctype_digit($_POST['id'])) {
throw new Exception('IDが不正です。');
}
$id = (int)$_POST['id'];
if (empty($_POST['book_title'])) {
throw new Exception('書籍名は必須です。');
}
$book_title = $_POST['book_title'];
// (他の項目のバリデーションも同様に行う)
$rating = (int)$_POST['rating'];
$review_text = $_POST['review_text'];
// --- データベースへの接続と更新処理 ---
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// UPDATE文を準備(SET句で更新するカラムを、WHERE句で対象のレコードを指定)
$sql = "UPDATE reviews SET book_title = ?, rating = ?, review_text = ? WHERE id = ?";
$stmt = $pdo->prepare($sql);
// プレースホルダに値をバインドして実行
$stmt->execute([$book_title, $rating, $review_text, $id]);
echo "ID: " . htmlspecialchars($id, ENT_QUOTES, 'UTF-8') . " のレビューを更新しました。";
} catch (Exception $e) {
echo "エラー発生: " . htmlspecialchars($e->getMessage(), ENT_QUOTES, 'UTF-8');
}
?>
<br>
<a href="list.php">レビュー一覧に戻る</a>
コードのポイント:
UPDATE
文:UPDATE テーブル名 SET カラム1 = ?, ... WHERE id = ?
という構文を使います。WHERE
句:WHERE id = ?
で更新対象のレコードを一意に特定します。これを忘れるとテーブル内の全データが更新されてしまうため、絶対に必要です。execute
の引数:SET
句の?
に対応する値と、**最後にWHERE
句の?
に対応する$id
**を、順番通りに配列で渡します。
まとめ
- データの更新機能は、**「編集フォーム(
edit.php
)」と「更新処理(update.php
)」**の2つのファイルで実現する。 - 編集フォームでは、DBから取得した値をフォーム部品の
value
属性などに入れて初期表示する。 - 更新処理では、
UPDATE ... SET ... WHERE ...
というSQL文を、安全なプリペアドステートメントで実行する。 - フォーム間で更新対象の
id
をやり取りするためにtype="hidden"
のinput
タグが重要な役割を果たす。
これで、Webアプリケーションの基本機能である**CRUD(Create, Read, Update, Delete)**のすべてを実装する知識が揃いました。