2021.08.31
【PHP応用】PDO⑩ UPDATE文(サンプルプログラム)
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文に値を埋め込み更新を行う