About Reference:アバウトリファレンス

当サイトはPHPなどのサーバーサイドスクリプトや、
MySQLなどのデータベースプログラミングのマニュアルサイトです。
WEBアプリケーションの開発やこれからWEBプログラミングを覚えたい!
というような方々のお手伝いが出来れば幸いです。

日本語 PEAR マニュアル

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

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

説明

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

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

上の例はフィールドをクォートし、出来上がる SQL は次のようになります。
INSERT INTO sometable FIELDS (textfield1, boolfield2, datefield3) VALUES ('blah', 1, '2006-02-21')
values のところには、追加される値が適切に入ります。 お気づきのとおり、"boolfield2" はクォートされていません。これは quote() メソッドで FALSE を指定したからです。

注意: プリペアドステートメント を使用する場合は、このクォート処理が自動的に行われます。 そのため自分でクォートする必要はありません。

識別子

データベースの識別子 (テーブル名やフィールド名) を 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 などの際にフィールドの値をクォートするものなどがあります。

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

エスケープ

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

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

プロパンガス一押し商品サーチ人気商品ポピュラーワードアニゲーム話題亭スポーツ選人ギアパーク話題商品サーチ注目商品探検隊夢人注目商品ピックグッズピックテレビ番長注目人索