- Home ›
- PEAR入門 ›
- データベース接続(PEAR::DB) ›
- HERE
プリペアドステートメント
例えば何行ものデータを挿入する場合を考えて見ます。値だけ異なるようなSQL文を何度も実行する場合、プリペアドステートメントを使うと便利です。
プリペアドステートメントを使う場合には"query"メソッドの代わりにDB_commonクラスで用意されている"prepare"メソッドを使います。
prepare resource prepare (string $query)
execute() で実行できるように、SQL 文を 準備します。 パラメータ: string $query 準備するクエリ。 返り値: resource - クエリのハンドル、あるいは失敗した場合に DB_Error オブ ジェクトを返します。
使い方は"query"メソッドでプレースホルダーを使った場合と同じです。何度も繰り返し使われるSQL文の中で、毎回異なる値の部分を「?」で置き換えて指定します。
$sql = "insert into shouhin (id, name) VALUES (?, ?)"; $stmt = $db->prepare($sql);
これでベースとなるSQL文が出来ましたので、次はプレースホルダー部分の値を指定して実行します。DB_commonクラスで用意されている"execute"メソッドを使います。
execute mixed &execute (resource $stmt [, mixed $data = array()])
prepare() で指定した SQL 文に $data の情報を適用し、クエリをデータベース に送信します。 パラメータ: resource $stmt prepare() が返すクエリハンドル。 mixed $data プリペアドステートメントに適用する配列・文字列あるい は数値のデータ。渡す項目数は、文中のプレースホルダの数と一致し ていなければなりません。プレースホルダがひとつだけの場合は配列 でない値を指定し、複数存在する場合は個々の値を要素にもつ配列を 指定します。 返り値: 結果を返すクエリ (例えば SELECT クエリなど) の場合は新しい DB_result オブジェクト、データを操作するクエリ (例えば INSERT クエリなど) の場合は DB_OK、あるいは失敗した場合には DB_Error オブジェクトを返します。
プレースホルダーで置き換えておいた部分に実際に当てはめたい値を指定します。1つの値であれば単に値を指定し、2つ以上ある場合は配列の形にして指定します。
$sql = "insert into shouhin (id, name) VALUES (?, ?)"; $stmt = $db->prepare($sql); $data = array(1, 'エアコン'); $db->execute($stmt, $data);
同じSQL文をベースにして何度も実行する場合は"execute"メソッドだけを繰り返し使用します。
$sql = "insert into shouhin (id, name) VALUES (?, ?)"; $stmt = $db->prepare($sql); $data = array(1, 'エアコン'); $db->execute($stmt, $data); $data = array(2, 'パソコン'); $db->execute($stmt, $data); $data = array(3, 'テレビ'); $db->execute($stmt, $data);
サンプルプログラム
では実際に試してみます。
<html> <head><title>PHP TEST</title></head> <body> <?php require_once 'DB.php'; $dsn = 'mysqli://testuser:testuser@localhost/uriage'; $db = DB::connect($dsn); if (PEAR::isError($db)) { die($db->getMessage()); } print('接続に成功しました<br>'); $db->query('SET NAMES sjis'); if (PEAR::isError($db)) { die($db->getMessage()); } $sql = 'select * from shouhin'; $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } while ($row =& $res->fetchRow(DB_FETCHMODE_OBJECT)){ print($row->id); print($row->name.'<br>'); } print('<br>データを追加します。<br><br>'); $sql = "insert into shouhin (id, name) VALUES (?, ?)"; $stmt = $db->prepare($sql); if (PEAR::isError($res)) { die($res->getMessage()); } $data = array(6, 'エアコン'); $db->execute($stmt, $data); if (PEAR::isError($res)) { die($res->getMessage()); } $data = array(7, '扇風機'); $db->execute($stmt, $data); if (PEAR::isError($res)) { die($res->getMessage()); } $data = array(8, '空気清浄機'); $db->execute($stmt, $data); if (PEAR::isError($res)) { die($res->getMessage()); } print('<br>追加後のデータを取得します。<br><br>'); $sql = 'select * from shouhin'; $res =& $db->query($sql); if (PEAR::isError($res)) { die($res->getMessage()); } while ($row =& $res->fetchRow(DB_FETCHMODE_OBJECT)){ print($row->id); print($row->name.'<br>'); } $db->disconnect(); ?> </body> </html>
上記をWWWサーバに設置しブラウザで見てみると下記のようなりました。
( Written by Tatsuo Ikura )