クォートおよびエスケープ

クォートおよびエスケープ -- 値を適切にクォートしてクエリを作成する

説明

MDB2 が提供する quote() メソッドを使用すると、DBMS にあわせて値をクォートし、 適切な形式でクエリを作成することができます。 このメソッドのパラメータは次の四つです (必須なのは最初のひとつだけです)。 まずクォートされる値、そしてその データ型、 値をクォートするかどうか、最後にワイルドカードをクォートするかどうかです。 データ型を指定しなかった場合は、値から推測します。

quote() の三番目のパラメータでは、 フィールドをクォートするかどうかを個々に指定することができます。

上の例はフィールドをクォートし、できあがる 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 に指示することができます。 ユーザが作成したクエリには、このオプションは何の影響も及ぼしません。

クォートされた識別子の中で次の文字を使用すると、 可搬性が失われます。

クォートされた識別子は、以下のドライバで正常に動作します。

Firebird/InterBase の場合、PHP 4 ではこの機能がうまく使えないようです。 PHP 5 では正しく動作します。

クォート方式

MDB2 API には、 クォート方法を指定するためのオプションが多数あります。 たとえば単に抽象化時の識別子だけをクォートするものや、 プリペアドステートメントでのinsert/update などの際にフィールドの値をクォートするものなどがあります。

quote_identifier オプションを使用すると、 すべてのフィールド識別子が SQL 文中で自動的にクォートされます。
$mdb2->setOption('quote_identifier', true);
こうすると、結果の SQL 文ですべてのフィールド名がバックティック演算子 '`' で囲まれます (MySQL の場合)。
SELECT * FROM `sometable` WHERE `id` = '123';
指定しなければ、以下のようになります。
SELECT * FROM sometable WHERE id='123';

エスケープ

値をクォートで囲まずにエスケープしたい場合は escape() メソッドを使用します。ワイルドカード (_ や %) もエスケープしたい場合は、二番目のパラメータを TRUE に設定します。

値の中のワイルドカードのみをエスケープしたい場合は、 escapePattern() メソッドを使用します。