【 PHP 】PHP8に入門してみた 196日目 PHPの基本 ( データベース bindParam )

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

データベース

bindParam

bindParambindValueとは異なり、executeメソッドが呼び出されたタイミングで評価が行われます。

bindParam_form.php

<?php
require_once './DbManager.php';
require_once './Encode.php';

try {
    // データベース接続d
    $db = getDb();

    // 書籍を降順に取得
    $stt = $db->query('SELECT * FROM book ORDER BY published DESC');

    // フォーム要素に付与する連番を定義
    $cnt = 0;

?>

    <!DOCTYPE html>
    <html lang="ja">
    <html>

    <head>
        <meta charset="UTF-8" />
        <title>既存データ更新</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
    </head>

    <body>
        <form method="POST" action="bindParam_process.php">
            <input type="submit" value="更新" />
            <table class="table">
                <thead>
                    <tr>
                        <th>ISBNコード</th>
                        <ht>書籍</ht>
                        <th>価格</th>
                        <th>出版社</th>
                        <th>刊行日</th>
                    </tr>
                </thead>
                <tbody>
                    <?php
                    // 一覧フォームを作成
                    while ($row = $stt->fetch(PDO::FETCH_ASSOC)) {
                        $cnt++;

                    ?>
                        <tr>
                            <td>
                                <?= e($row['isbn']) ?>
                                <input type="hidden" name=" isbn<?= e($cnt) ?>" value="<?= e($row['isbn']) ?>" />
                            </td>
                            <td>
                                <input type="text" name="title<?= e($cnt) ?>" value="<?= e($row['title']) ?>" size="45" />
                            </td>
                            <td>
                                <input type="text" name="price<?= e($cnt) ?>" value="<?= e($row['price']) ?>" size="5" />
                            </td>
                            <td>
                                <input type="text" name="publish<?= e($cnt) ?>" value="<?= e($row['publish']) ?>" size="12" />
                            </td>
                            <td>
                                <input type="text" name="published<?= e($cnt) ?>" value="<?= e($row['published']) ?>" size="12" />
                            </td>


                        </tr>
                <?php
                    }
                } catch (PDOException $e) {
                    die("エラーメッセージ : {$e->getMessage()}");
                }
                ?>
                </tbody>
            </table>
            <input type="hidden" name="cnt" value="<?= e($cnt) ?>" />
        </form>
    </body>

    </html>

    </html>

 

bindParam_process.php

<?php
require_once './DbManager.php';

try {
    // データベース接続
    $db = getDb();
    // UPDATE
    $stt = $db->prepare('UPDATE book SET title=:title, price=:price, publish=:publish, published=:published WHERE isbn=:isbn');

    // プレースホルダーにバインドする変数に関連付け
    $stt->bindParam(':isbn', $isbn); // ←まだ$isbnは定義していないの使える!?
    $stt->bindParam(':title', $title);
    $stt->bindParam(':price', $price);
    $stt->bindParam(':publish', $publish);
    $stt->bindParam(':published', $published);

    // フォームから入力値を順に取得して変数にセット
    for ($i = 1; $i <= $_POST['cnt']; $i++) {
        $isbn = $_POST['isbn' . $i]; // ← ここで$isbnの代入が行われるのです!
        $title = $_POST['title' . $i];
        $price = $_POST['price' . $i];
        $publish = $_POST['publish' . $i];
        $published = $_POST['published' . $i];

        // UPDATE実行
        $stt->execute();
    }

    // 処理後は元のフォームにリダイレクト
    header('Location: http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/bindParam_form.php');
} catch (PDOException $e) {
    die("エラーメッセージ:{$e->getMessage()}");
}

 

 

 

 

 

メモ

コードが冗長!

PHPPHP

Posted by raika@blog