PEAR_DBを使う場合のSQL予約語との衝突エラー

はてなブックマークに追加はてなブックマーク Yahoo!ブックマークに登録 ニフティクリップに追加 Livedoor クリップに追加 BuzzurlにブックマークBuzzurlにブックマーク Twitterに投稿  

現在、OpenPNEの拡張を行っていますが、本日遭遇したバグ。
OpenPNEは、データベースの操作に、PHPのライブラリ、PEAR_DBが使ってあります。
拡張で追加したテーブルに、新規にレコードを挿入する処理を書いていたのですが、このとき悩ましいバグに当りました。

$table_name = 'hoge_table';
$data = array(
    'hoge' => $hoge,
    'inner' => $foo,    // こいつ
    'outer' => $bar,    // こいつ
    'set' => $baz,    // こいつ
    'fuga' => $fuga,
);
 
// レコード挿入
db_insert($table_name, $data);    // エラー!

db_insert() は、$table_name にはDBテーブル名を指定、$data は、挿入するデータのハッシュ(フィールド名 ⇒ レコード値 が一要素)を指定する関数です。
このとき、上記のように$data というハッシュを作っていたのですけど(実際には、フィールドが30以上あるので、もっと要素数の多いハッシュ)、何度やってもエラーになる。

よって、ハッシュをひとつずつ試しながらチェックしたところ、フィールド名にinner, outer, set を使っているところでエラーが発生していることが判明。
どうやらこれらの単語が、SQL予約語なので、衝突してエラーになっていたみたいです。

あとで気づいたのですが、そういえばSQL文には、INNER JOIN, OUTER JOIN, SET CHARACTER SET などの構文があります。
ですので、SQL文の予約語になっている単語は、フィールド名(カラム名)には使わないほうが良さそうです。
結局、フィールド名を変更、ハッシュもそれに応じて変更したところ、なんなく処理が通りました。


日時: 2009年01月17日 18:15
コメントを投稿






トラックバック

■この記事のトラックバックURL:
http://www.mapee.jp/mpe334/mt-tb.cgi/463

この記事にトラックバックされる方は、参照先が分かるようにするために、「PEAR_DBを使う場合のSQL予約語との衝突エラー」へのリンクをお願いいたします。
以下のHTMLタグをトラックバック送信元ページ内に挿入して下さい。



※この記事へのリンクがない、また関連のないページからのトラックバックは反映されませんので、ご了承下さい。






あわせて読みたいブログパーツ
フィードメーター - ウェブライフハック