MDB2 が提供する quote() メソッドを使用すると、DBMS にあわせて値をクォートし、 適切な形式でクエリを作成することができます。 このメソッドのパラメータは次の四つです (必須なのは最初のひとつだけです)。 まずクォートされる値、そしてその データ型、 値をクォートするかどうか、最後にワイルドカードをクォートするかどうかです。 データ型を指定しなかった場合は、値から推測します。
クエリでの値のクォート
<?php
// プログラムの最初で、$mdb2 という名前の
// 有効な MDB2 オブジェクトを作成します...
require_once 'MDB2.php';
$mdb2 =& MDB2::connect('pgsql://usr:pw@localhost/dbnam');
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
// 挿入する値の例
$id = 1;
$name = 'sample item';
$time = date('Y-m-d H:i:s');
// クエリを実行します...
$query = 'INSERT INTO tablename (id, itemname, saved_time) VALUES ('
. $mdb2->quote($id, 'integer') .', '
. $mdb2->quote($name, 'text') .', '
. $mdb2->quote($time, 'timestamp') .')';
$res =& $mdb2->exec($query);
?>
quote() の三番目のパラメータでは、 フィールドをクォートするかどうかを個々に指定することができます。
クォートする値を個々に選択する
<?php
$query = 'INSERT INTO sometable (textfield1, boolfield2, datefield3) VALUES ('
.$mdb2->quote($val1, "text", true).', '
.$mdb2->quote($val2, "boolean", false).', '
.$mdb2->quote($val3, "date", true).')';
?>
上の例はフィールドをクォートし、できあがる SQL は次のようになります。
INSERT INTO sometable FIELDS (textfield1, boolfield2, datefield3) VALUES ('blah', 1, '2006-02-21')
values のところには、追加される値が適切に入ります。 お気づきのとおり、"boolfield2" はクォートされていません。これは quote() メソッドで FALSE を指定したからです。
注意: プリペアドステートメント を使用する場合は、このクォート処理が自動的に行われます。 そのため自分でクォートする必要はありません。
データベースの識別子 (テーブル名やフィールド名) を quoteIdentifier() でクォートすることができます。この方式は、使用しているデータベースドライバに依存します。 注意: 識別子をクォート「できる」からといって、必ずしもクォート 「しなければならない」というわけではありません。たいていの場合は、 クォートすることで解決する問題よりもクォートすることで新たに起こる問題のほうが大きくなります。 とはいえ、たとえばフィールド名に予約語を使用したい場合などは、 クォートが必要になるでしょう (このような場合は、 できる限りフィールド名を変更することをお勧めします)。 また、テーブル名にピリオドを含む場合も quoteIdentifier() は使わないでください (って言うか、 そもそもテーブル名にピリオドを使うっていうこと自体おすすめしません)。 というのも、そんな形式のテーブル名は「スキーマ名.テーブル名」 形式と誤解されてしまうことがあるからです。
MDB2 の内部メソッドの中にはクエリを生成するものがあります。
MDB2 のオプション quote_identifier
を有効にすると、
これらのクエリ内の識別子をクォートするよう MDB2 に指示することができます。
ユーザが作成したクエリには、このオプションは何の影響も及ぼしません。
クォートされた識別子の中で次の文字を使用すると、 可搬性が失われます。
バックティック (`
) -- MySQL で問題となります
ダブルクォート (") -- Oracle で問題となります
角括弧 ([ あるいは ]) -- Access で問題となります
クォートされた識別子は、以下のドライバで正常に動作します。
mssql
mysql
mysqli
oci8
pgsql
sqlite
Firebird/InterBase の場合、PHP 4 ではこの機能がうまく使えないようです。 PHP 5 では正しく動作します。
MDB2 API には、 クォート方法を指定するためのオプションが多数あります。 たとえば単に抽象化時の識別子だけをクォートするものや、 プリペアドステートメントでのinsert/update などの際にフィールドの値をクォートするものなどがあります。
quote_identifier
オプションを使用すると、
すべてのフィールド識別子が SQL 文中で自動的にクォートされます。
<?php
$mdb2->setOption('quote_identifier', true);
?>
こうすると、結果の SQL 文ですべてのフィールド名がバックティック演算子
'`
' で囲まれます (MySQL の場合)。
SELECT * FROM `sometable` WHERE `id` = '123';
指定しなければ、以下のようになります。
SELECT * FROM sometable WHERE id='123';
値をクォートで囲まずにエスケープしたい場合は escape() メソッドを使用します。ワイルドカード (_ や %) もエスケープしたい場合は、二番目のパラメータを TRUE に設定します。
値の中のワイルドカードのみをエスケープしたい場合は、 escapePattern() メソッドを使用します。