prepareQuery() および executeQuery*() によって、より強力で柔軟性のあるクエリを実行することができます。 値が違うだけの同じクエリを何度も実行する場合などに使用できます。 例えば、住所の一覧をデータベースに登録する場合などがこれにあたります。 また、さまざまなデータベースをサポートする必要があり、 それらがそれぞれ標準の SQL とはことなる実装をしている場合などにも便利です。
二種類のデータベースをサポートする必要があり、それらはそれぞれ INSERT の構文が異なっているとしましょう。
それぞれに対応するスクリプトを作成するには、 このような形式でクエリを配列にします。
<?php
$statement['db1']['INSERT_PERSON'] = "INSERT INTO person ( surname, name, age ) VALUES ( ?, ?, ? )" ;
$statement['db2']['INSERT_PERSON'] = "INSERT INTO person SET surname=?, name=?, age=?" ;
?>
上の機能を使用するには、二段階の手続きが必要です。まず最初に prepareQuery でステートメントを準備し、次に executeQuery でそれを実行します。
Prepare() は、最低一度はコールする必要があります。これがステートメントのハンドルを返します。
汎用的なステートメントを作成するのは簡単です。 まずこのように、普通の SQL を書きます。
そして、スクリプトの実行時に置き換えられるパラメータがどれなのかを調べ、 それをプレースホルダに置き換えます。
以上です! これで汎用的なステートメントができあがりました。これを prepareQuery() で使用することができます。
prepareQuery() は、さまざまな形式のプレースホルダやワイルドカードをサポートしています。
?
- (推奨) これは、文字列や数値のようなスカラー値を表します。
値は、データベースに応じてクォートされます。
!
- これはスカラー値を表し、
ステートメントに "そのままの形で" 挿入されます。
&
- ここには実際に存在するファイル名を指定し、
そのファイルの内容がステートメントに挿入されます
(画像ファイルのバイナリデータをデータベースに格納するなど)。
ステートメントを準備したら、次に実行します。実行とは、 プリペアドステートメントの変数に値を代入することです。これを行うには、 executeQuery() に二つの引数を指定します。 prepareQuery() のステートメントハンドルと、代入する値の配列です。 配列は、数値添字形式でなければなりません。 配列の最初のエントリが最初のワイルドカードに、 そして二番目のエントリが二番目のワイルドカードに、 といったように対応します。 並び順は、使用しているワイルドカード文字の種類とは独立しています。
データベースへのデータの挿入
<?php
$alldata = array( array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $dbh->prepareQuery("INSERT INTO numbers VALUES(?,?,?)");
foreach ($alldata as $row) {
$dbh->executeQuery($sth, $row);
}
?>
この例では、クエリが四回実行されます。
executeMultiple() も同じように動作しますが、二次元の配列を指定する必要があります。 そのかわり、この例のようにいちいち foreach を行わずにすみます。
executeQuery() のかわりに executeMultiple() を使用する
<?php
...
$alldata = array( array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $dbh->prepareQuery("INSERT INTO numbers VALUES(?,?,?)");
$dbh->executeMultiple($sth, $alldata);
}
?>
結果は同じです。途中で失敗すると、それ以降のレコードは実行されません。
executeQuery*() は、失敗した場合に MDB_Error、それ以外の場合に MDB_OK を返します。