MDB2 が提供する quote() メソッドを使用すると、DBMS にあわせて値をクォートし、 適切な形式でクエリを作成することができます。 このメソッドのパラメータは次の四つです (必須なのは最初のひとつだけです)。 まずクォートされる値、そしてその データ型、 値をクォートするかどうか、最後にワイルドカードをクォートするかどうかです。 データ型を指定しなかった場合は、値から推測します。
例 39-1クエリでの値のクォート
|
quote() の三番目のパラメータでは、 フィールドをクォートするかどうかを個々に指定することができます。
例 39-2クォートする値を個々に選択する
|
上の例はフィールドをクォートし、できあがる SQL は次のようになります。
INSERT INTO sometable FIELDS (textfield1, boolfield2, datefield3) VALUES ('blah', 1, '2006-02-21') |
注意: プリペアドステートメント を使用する場合は、このクォート処理が自動的に行われます。 そのため自分でクォートする必要はありません。
データベースの識別子 (テーブル名やフィールド名) を quoteIdentifier() でクォートすることができます。この方式は、使用しているデータベースドライバに依存します。 注意: 識別子をクォート「できる」からといって、必ずしもクォート 「しなければならない」というわけではありません。たいていの場合は、 クォートすることで解決する問題よりもクォートすることで新たに起こる問題のほうが大きくなります。 とはいえ、たとえばフィールド名に予約語を使用したい場合などは、 クォートが必要になるでしょう (このような場合は、 できる限りフィールド名を変更することをお勧めします)。 また、テーブル名にピリオドを含む場合も quoteIdentifier() は使わないでください (って言うか、 そもそもテーブル名にピリオドを使うっていうこと自体おすすめしません)。 というのも、そんな形式のテーブル名は「スキーマ名.テーブル名」 形式と誤解されてしまうことがあるからです。
MDB2 の内部メソッドの中にはクエリを生成するものがあります。 MDB2 のオプション quote_identifier を有効にすると、 これらのクエリ内の識別子をクォートするよう MDB2 に指示することができます。 ユーザが作成したクエリには、このオプションは何の影響も及ぼしません。
クォートされた識別子の中で次の文字を使用すると、 可搬性が失われます。
バックティック (`) -- MySQL で問題となります
ダブルクォート (") -- Oracle で問題となります
角括弧 ([ あるいは ]) -- Access で問題となります
クォートされた識別子は、以下のドライバで正常に動作します。
mssql
mysql
mysqli
oci8
pgsql
sqlite
MDB2 API には、 クォート方法を指定するためのオプションが多数あります。 たとえば単に抽象化時の識別子だけをクォートするものや、 プリペアドステートメントでのinsert/update などの際にフィールドの値をクォートするものなどがあります。
quote_identifier オプションを使用すると、 すべてのフィールド識別子が SQL 文中で自動的にクォートされます。
$mdb2->setOption('quote_identifier', true); |
SELECT * FROM `sometable` WHERE `id` = '123'; |
SELECT * FROM sometable WHERE id='123'; |