PHP入門 データベース SQLクエリの発行
データベースにアクセスし、データを登録する方法を解説しています。
入力値を元にデータベースに登録する
画面の入力フォームで登録した値が、bookテーブルに挿入するサンプル
テーブル情報:book
フィールド名 | データ型 | 概要 |
---|---|---|
isbn | VARCHEAR(17) | ISBNコード |
title | VARCHEAR(100) | 書名 |
price | INT | 価格 |
publish | VARCHEAR(20) | 出版社 |
published | DATE | 刊行日 |
sample.php
<!DOCTYPE html>
<head>
<meta charset="UTF-8" />
<title>データの登録</title>
</head>
<body>
<form method="POST" action="insert_process.php"> <div>
<label for="isbn">ISBN:</label><br />
<input id="isbn" type="text" name="isbn" size="25" maxlength="20" />
</div><div>
<label for="title">書名:</label><br />
<input id="title" type="text" name="title" size="35" maxlength="150" />
</div><div>
<label for="price">価格:</label><br />
<input id="price" type="text" name="price" size="6" maxlength="5" />
</div><div>
<label for="publish">出版社:</label><br />
<input id="publish" type="text" name="publish" size="25" maxlength="30" />
</div><div>
<label for="published">刊行日:</label><br />
<input id="published" type="text" name="published" size="15" maxlength="10" />
</div><div>
<input type="submit" value="登録" />
</div>
</form>
</body>
</html>
insert_process.php
<?php
require_once './DbManager.php';
try {
// データベースへの接続を確立
$db = getDb();
// INSERT命令の準備
$stt = $db->prepare('INSERT INTO book (isbn, title, price, publish, published) VALUES (:isbn,:title,:price,:publish,:published)');
// INSERT命令にポストデータの内容をセット
$stt->bindValue(':isbn', $_POST['isbn']);
$stt->bindValue(':title', $_POST['title']);
$stt->bindValue(':price', $_POST['price']);
$stt->bindValue(':publish', $_POST['publish']);
$stt->bindValue(':published', $_POST['published']);
// INSERT命令を実行
$stt->execute();
// 処理後は入力フォームにリダイレクト
header('Location:http://'.$_SERVER['HTTP_HOST'].'/sample1.php');
} catch (PDOException $e) {
die("エラーメッセージ:{$e->getMessage()}");
}
処理の解説
データベースに発行する一連の命令を管理するのは、PDOStatementオブジェクトの役割です。
PDOStatementオブジェクトは、PDOオブジェクト$dbからprepareメソッドを呼び出すことで取得できます。
構文:prepareメソッド
PDO::prepare(string $statement [, array $driver_options]):PDOStatement
$statement | 発行するSQL命令 |
$driver_options | 動作オプション |
prepareメソッドには、データベースに対して発行したいSQL命令を指定します。bookというテーブルのisbn、title、price、publish、publishedというフィールドに、それぞれ指定された値を設定します。
prepareメソッドに含まれる「:名前」という記述はプレイスホルダーを表しています。プレイスホルダーとは、パラメーターの置き場所のことです。PDOStatementオブジェクトでは「:名前」で表されたプレイスホルダーに対して、実行時に任意のパラメーターを引き渡すことができます。
構文:bindValueメソッド
PDOStatement::prepare(mixed $parameter, mixed $value[, int $data_type = PDO::PARAM_STR]):bool
$parameter | パラメーター名 |
$value | パラメーター値 |
$data_type | データ型 |
これでSQL命令を発行する準備が整いました。あとは、executeメソッドによって実際にデータベースに命令が送信/実行されます。
INSERT/UPDATE/DELETE命令によって影響したレコード数を取得するには、rowCountメソッドを利用します。ただし、データベースによってはレコード件数を返さない場合があります。
print "件数:{$stt->rowCount()}";
名前付きパラメーターと名前なしパラメーター
「:名前」という形式のプレイスホルダーを利用しましたが、「?」という形式のプレイスホルダーを指定することもできます。前者を名前付きパラメーター、後者を名前なしパラメーターと呼びます。
$stt = $db->prepare('INSERT INTO book (isbn, title, price, publish, published)
VALUES (?,?,?,?,?)');
$stt->bindValue(1, $_POST['isbn']);
$stt->bindValue(2, $_POST['title']);
$stt->bindValue(3, $_POST['price']);
$stt->bindValue(4, $_POST['publish']);
$stt->bindValue(5, $_POST['published']);
名前なしパラメーターでは、bindValueメソッドの第1引数に(パラメーター名の代わりに)インデックス番号を指定します。また、インデックス番号は0スタートではなく、1スタートからになります。
オートインクリメント値を取得する
オートインクリメント(自動連番)機能とは、新たなレコードを登録するたびに連番を自動的に生成し、該当の列に設定する機能です。スクリプトを記述する際には、オートインクリメント機能によって自動採番された値を取得し、後続の処理を行いたいケースもあります。このようなケースでは、lastInsertIdメソッドを利用します。
<?php
require_once './DbManager.php';
try {
// データベースへの接続を確立
$db = getDb();
// INSERT命令を実行
$stt->execute("INSERT INTO member (nam, sex, old, enter, memo) VALUES ('山田太郎','男',18, '2024-04-31','')");
//直近のINSERT命令で取得したオートインクリメント値を取得
print "直近のID値:{$db->lastInsertId()}"
} catch (PDOException $e) {
die("エラーメッセージ:{$e->getMessage()}");
}
構文:bindValueメソッド
PDO::lastInsertId([string $name]): string
$name | シーケンス名 |
シーケンスとは、オートインクリメントによく似た機能で、データベース上で一意な数値キーを生成するために利用します。PostgreSQLやOracleのようなデータベースでは、シーケンスを利用して連番を生成します。引数$nameには、シーケンスを利用する場合にその名前を指定します。