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

PHP

はじめに

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

データの削除

この記事では、PDOでプリペアドステートメントを使用したデータ削除のサンプルプログラムを紹介します。
データ削除はデータ更新と同様に次の内容について詳細な説明は省略しています。

  • プリペアドステートメントを使用しないSQL
  • データ削除処理の流れ、トランザクション処理

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

サンプルプログラム

サンプルプログラムは商品テーブル(GOODS)、商品分類関連テーブル(GOODS_CLASSES_RELARATION)の削除を行います。

データ削除前の状態

「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"];                  // 商品コード
    $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;
    }

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

        // トランザクションの開始
        $pdo->beginTransaction();
        
        // 商品テーブルDELETE文のプリペアードステートメントの出力
        $stmt = $pdo->prepare("DELETE FROM GOODS WHERE GOODS_CODE=:code AND EDATE=:edate");

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

        // 商品テーブルDELETE文のプリペアードステートメントの出力
        $stmt = $pdo->prepare("DELETE FROM GOODS_CLASSES_RELARATION WHERE GOODS_CODE=:code");

        // プリペアードステートメントの実行
        $sql_cnt = $stmt->execute([":code" => $code]);
        // プリペアードステートメントのデバッグ出力
        $stmt->debugDumpParams();
        // 実行件数の出力
        echo "<br>\nGOODS_CLASSES_RELARATIONのDELETE件数:" . $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」でデータ削除後の状態を確認した結果は次の通りです。

コメント