「SELECT」や「ORDER」などの予約語をテーブル名やカラム名として使用する場合には、例えば Oracle の場合は、ダブルクォート (“) で名前を囲む必要があります。
ここでは、Zend Framework でこれらの処理を記述するサンプルコードを掲載しています。なお、ここでの出力例は Oracle の場合であり、その他のデータベースでは異なる結果が得られることもあります。
スポンサーリンク
SQL予約語をテーブル名やカラム名に使用する ( quoteIdentifier )
ZendFramework では、SQL予約語をテーブル名やカラム名で使用するため(これはちょっと言い過ぎです。と、いうよりも間違いですね(-_-;))に Zend_Db_Adapter の quoteIdentifier メソッドが提供されています。以下は「order」テーブルの「by」列を取得する SQL 文の組み立てを行うサンプルコードになります。
// DB アダプタを取得
$adpt = Zend_Db::factory($config->database);
// データベースへ接続
$adpt->getConnection();
$tableName = $adpt->quoteIdentifier("order");
$colName = $adpt->quoteIdentifier("by");
// select 文の組み立て
$sql = "select $colName from $tableName";
var_dump($sql);
// select "by" from "order"
/*
* この位置で SQL の発行などの処理
*
*/
// データベースから切断
$adpt->closeConnection();
テーブル名やカラム名のエイリアス(別名)を使用する
上記の quoteIdentifier メソッドは、テーブル名やカラム名にエイリアス(別名)についてはサポートしていません。エイリアスに対応するには次のように quoteTableAs または quoteColumnAs メソッドを使用します。
// テーブル名のエイリアスを設定する
$tableName = $adpt->quoteTableAs("order", "aliasOrder");
// カラム名のエイリアスを設定する
$colName = $adpt->quoteColumnAs("by", "aliasBy");
// select 文の組み立て
$sql = "select $colName from $tableName";
var_dump($sql);
// 'select "by" AS "aliasBy" from "order" "aliasOrder"'