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

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

Description

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() メソッドを使用します。

クエリの実行 (Previous) データ型の処理の概要 (Next)
Last updated: Mon, 20 Oct 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.