PDO⑩ UPDATE文
今回は更新機能のサンプルを作成してみましょう。
■仕様
- 一覧表示されるデータそれぞれに変更画面へのリンクがある
- リンクを押下すると変更画面へ遷移し、「名前」「年齢」「住所」を変更することができるシステム
- フォームに変更データを入力し更新ボタンを押すと、更新結果と一覧表示ページへのリンクが表示される
■プログラム
○一覧表示画面
list.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | <?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文に値を埋め込み更新を行う