【PHP】これで分かる関数! – データの更新 –

PHP

はじめに

この記事で紹介するサンプルプログラムは次の記事で書いている共通関数を使用している場合があります。

データの更新

この記事では、PDOでプリペアドステートメントを使用したデータ更新のサンプルプログラムを紹介します。
プリペアドステートメントを使用しない場合のサンプルはデータの登録と同じになるため、説明は省略します。
また、データ更新処理の流れ、トランザクション処理はデータ登録と同じになるため、詳細な説明は省略しています。
これらのことについて詳しいことを知りたい方は次の記事を見てください。

サンプルプログラム

サンプルプログラムは商品テーブル(GOODS)の更新を行います。

データ更新前の状態

「HeidiSQL」でデータ更新前の状態を確認した結果は次の通りです。

「HeidiSQL」 について詳しいことを知りたい方は次の記事を見てください。

サンプルプログラム

サンプルプログラムはデータ更新情報を入力する画面、データ更新結果を確認する画面の構成になっています。

・画面
入力画面の「更新」ボタンを押下すると、更新結果画面に遷移します。

・入力画面のコード

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";
    $filename = basename(__FILE__);
 
    // 共通HTMLヘッダ出力処理
    common_html_header($filename);
 
    echo "ファイル名:${filename}<br>\n";
    echo "テーブルの更新・削除/入力画面<br>\n";
?>
<form id="sendfrm" action="sample02_09_03_15.php", method="POST">
<table border="1" width="450px">
    <tr>
        <th width="100px">商品コード</th>
        <td><input type="text" name="code" style="width:150px;" maxlength="10"></td>
    </tr>
    <tr>
        <th>商品名</th>
        <td><input type="text" name="name" style="width:300px;" maxlength="100"></td>
    </tr>
    <tr>
        <th>価格</th>
        <td><input type="text" name="price" style="width:100px;" maxlength="11"></td>
    </tr>
    <tr>
        <th>開始日</th>
        <td><input type="text" name="sdate" style="width:100px;" maxlength="8"></td>
    </tr>
    <tr>
        <th>終了日</th>
        <td><input type="text" name="edate" style="width:100px;" maxlength="8"></td>
    </tr>
</table>
<br>
<input type="button" name="update" value="更新" style="width: 100px;" onclick="open_next(15)">
<input type="button" name="delete" value="削除" style="width: 100px;" onclick="open_next(16)">
</form>
<script>
function open_next(id) {
    var frm = document.getElementById("sendfrm");

    frm.action = "sample02_09_03_" + id + ".php";
    frm.submit();
}
</script>

<?php
    // 共通HTMLフッター出力処理
    common_html_footer();
?>

・更新結果画面のコード

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);
    // 共通ライブラリの読み込み
    require_once __DIR__ . "../../../lib/sample_common.php";

    $filename = basename(__FILE__);
 
    // 共通HTMLヘッダ出力処理
    common_html_header($filename);
 
    echo "ファイル名:${filename}<br>\n";
    echo "テーブルの更新・結果出力画面<br>\n";

    // POSTデータの取得
    $code = $_POST["code"];                  // 商品コード
    $name = $_POST["name"];                  // 商品名
    $price = $_POST["price"];                // 価格
    $sdate = $_POST["sdate"];                // 開始日
    $edate = $_POST["edate"];                // 終了日

    $dbn = "mysql:dbname=sampledb;host=localhost;port=3306";    // DB接続文字列
    $usr = "sampleusr";                                         // DBユーザ名
    $pw = "sample";                                             // DBユーザのパスワード

    $pdo = null;         // PDOオブジェクト
    $stmt = null;        // PDOStatementオブジェクト

    // 入力チェック
    if($code === "" || $edate === "") {      // 商品コード、終了日が未入力の場合、エラーメッセージを出力する
        echo "商品コード、終了日の入力は必須です<br>\n";
        common_html_footer();
        return;
    }
    if($name === "" || $price === "" || $sdate === "" ) {
        echo "商品コード、終了日以外の全ての項目は入力が必要です<br>\n";
        common_html_footer();
        return;
    }

    try {
        // DB接続
        $pdo = connect_db($dbn, $usr, $pw);

        // トランザクションの開始
        $pdo->beginTransaction();

        $sql = "UPDATE GOODS SET GOODS_NAME=:name, SDATE=:sdate, PRICE=:price";
        $sql = $sql . " WHERE GOODS_CODE=:code AND EDATE=:edate";
        
        // 商品テーブルUPDATE文のプリペアードステートメントの出力
        $stmt = $pdo->prepare($sql);
        // バインド変数のパラメータリスト
        $params = [":code" => $code, ":edate" => $edate, ":name" => $name, ":sdate" => $sdate, ":price" => $price];

        // プリペアードステートメントの実行
        $sql_cnt = $stmt->execute($params);
        // プリペアードステートメントのデバッグ出力
        $stmt->debugDumpParams();
        // 実行件数の出力
        echo "<br>\nGOODSのUPDATE件数:" . $sql_cnt .":<br>\n";

        // コミット
        $pdo->commit();
    } catch(PDOException $e) {
        // エラーの出力
        echo $e->getLine() . " " . $e->getCode() . " " . $e->getMessage() . "<br>\n";
        // ロールバック
        $pdo->rollBack();
    } finally {
        // PDOStatement
        if(!is_null($stmt)) {
            $stmt = null;
        }
        // DB接続のクローズ
        if(!is_null($pdo)) {
            $pdo = null;
        }
    }
    
    // 共通HTMLフッター出力処理
    common_html_footer();
?>

データ更新後の状態

データ更新後の状態を「HeidiSQL」で確認した結果は次の通りです。

コメント