PDO⑩ UPDATE文
今回は更新機能のサンプルを作成してみましょう。
■仕様
- 一覧表示されるデータそれぞれに変更画面へのリンクがある
- リンクを押下すると変更画面へ遷移し、「名前」「年齢」「住所」を変更することができるシステム
- フォームに変更データを入力し更新ボタンを押すと、更新結果と一覧表示ページへのリンクが表示される
■プログラム
○一覧表示画面
list.php
<?php
try {
// 接続処理
$dsn = 'mysql:host=localhost;dbname=sample_db';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
// SELECT文を発行
$sql = "SELECT * FROM members";
$stmt = $dbh->prepare($sql);
$stmt->execute();
$rows = $stmt->fetchAll(); // 全てのレコードを取得
// 接続切断
$dbh = null;
} catch (PDOException $e) {
print $e->getMessage() . "<br/>";
die();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>一覧</title>
</head>
<body>
<table border="1">
<tr>
<th>ID</th>
<th>名前</th>
<th>年齢</th>
<th>住所</th>
<th>更新</th>
</tr>
<?php
foreach($rows as $row){
?>
<tr>
<td><?php print($row['id']) ?></td>
<td><?php print($row['name']) ?></td>
<td><?php print($row['age']) ?></td>
<td><?php print($row['address']) ?></td>
<td><a href="edit.php?id=<?php print($row['id']) ?>">更新</a></td>
</tr>
<?php
}
?>
</table>
</body>
</html>
○変更画面
edit.php
<?php
if (isset($_GET['id'])) {
try {
// 接続処理
$dsn = 'mysql:host=localhost;dbname=sample_db';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
// SELECT文を発行
$sql = "SELECT * FROM members WHERE id = :id";
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
$stmt->execute();
$member = $stmt->fetch(PDO::FETCH_OBJ); // 1件のレコードを取得
// 接続切断
$dbh = null;
} catch (PDOException $e) {
print $e->getMessage() . "<br/>";
die();
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>変更画面</title>
</head>
<body>
<form action="./update.php" method="post">
<input type="hidden" name="id" value="<?php print($member->id) ?>">
<label for="name">名前</label>
<input type="text" name="name" value="<?php print($member->name) ?>">
<br>
<label for="age">年齢</label>
<input type="text" name="age" value="<?php print($member->age) ?>">
<br>
<label for="address">住所</label>
<input type="text" name="address" value="<?php print($member->address) ?>">
<br>
<button type="submit">更新</button>
<br>
</form>
</body>
</html>
○更新プログラム
update.php
<?php
if (isset($_POST['id'])) {
try {
// 接続処理
$dsn = 'mysql:host=localhost;dbname=sample_db';
$user = 'root';
$password = '';
$dbh = new PDO($dsn, $user, $password);
// UPDATE文を発行
$id = $_POST['id']; // UPDATEするレコードのID
$name = isset($_POST['name']) ? $_POST['name'] : '';
$age = isset($_POST['age']) ? $_POST['age'] : 0;
$address = isset($_POST['address']) ? $_POST['address'] : '';
$sql = "UPDATE members SET name = :name, age = :age, address = :address WHERE id = :id";
$stmt = $dbh->prepare($sql);
$stmt->execute([":name" => $name, ":age" => $age, ":address" => $address, ":id" => $id ]); // 連想配列でバインド
print("レコードを更新しました<br>");
print('<a href="list.php">一覧表示へ</a>');
// 接続切断
$dbh = null;
} catch (PDOException $e) {
print $e->getMessage() . "<br/>";
die();
}
}
?>
■解説
まず一覧表示画面について、
中身はSELECT文のときに使用したサンプルコードとほとんど変わりません。
仕様に書かれている通り、データごとに更新画面へのリンクを追加しました。(39行目、50行目)
次に変更画面について、
こちらもINSERT文のサンプルで使用したものをベースにしています。
ポイントは一覧表示画面から遷移する際にGETで受け取った id のデータを使用して1レコードを取得し、
変更画面に予めデータを埋め込んでいます。
最後に更新プログラムについて、
こちらはUPDATE文のサンプルで使用したものをベースにしています。
POSTで送られてきた入力データをSQLに埋め込み処理を行っています。
処理が完了したあとは更新完了のメッセージとともに一覧画面へのリンクを表示しています。
少し大掛かりなサンプルになってしまいましたが、
今回大事なのは最後の update.php です。
POSTで送られてきたデータをSQLに埋め込みデータを更新するまでの処理の流れを追えるようにしましょう。
今回使用したサンプルはこのあと紹介するDELETE文でも同じように使用しますので
よければそちらの記事も参考にしてみてください。
■まとめ
- 変更前のデータは主キーを用いてSELECT文で取得する
- 受け取ったデータをもとにUPDATE文に値を埋め込み更新を行う


