【 PHP 】PHP8に入門してみた 196日目 PHPの基本 ( データベース bindParam )
PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。
データベース
bindParam
bindParam
はbindValue
とは異なり、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()}");
}
メモ
コードが冗長!
ディスカッション
コメント一覧
まだ、コメントがありません