Developer

【PHP応用】PDO⑩ UPDATE文(サンプルプログラム)
2021.08.31
Lv1

【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文に値を埋め込み更新を行う