DBIx::Customで where を設定する時の注意点

DBIx::Customで where を設定する時の注意点

DBIx::Custom - search.cpan.org
DBIx-Custom-0.1705

DBIx::Custom select メソッドの whereの項目を見ると様々な指定方法が出来ることが分かる。

注意する点はStringを渡す時。

where => "url = 'http://hoge.com/huga.cgi?key=value' ",

上のように条件に ? が含まれる場合、SQLの作成に失敗する。(DBIx::Custom::QueryBuilder::build_queryでかな?)

? がメタ文字として扱われるため?(\?とエスケープしてもダメ)

Hashリファレンスで渡すと大丈夫です。

where => {url => 'http://hoge.com/huga.cgi?key=value' },

これを踏まえてコードにすると、安全なのはこんな感じのコードになるのかな。

    my $id = 1;
    my $url = 'http://hoge.com/huga.cgi?key=value';
    $result = $dbi->select(
        table   =>  'table_name',
        column  => [qw/title content url/],
        where => [
                    ["and", "{= id}", "url = :url", "update_time > SUBDATE( NOW(), interval 7 day )"],
                    { id => $id, url => $url},
        ],
    );

※ {= id} は "id = :id" とも書ける(url = :urlも同様)。あえて両方含めてみた。

where にはDBIx::Custom::Whereオブジェクトも指定できますが、DBIx::Custom::Whereオブジェクトを生成する時にも同様で、? を含めた条件には注意が必要。

追記:タグ機能は廃止予定だそうです。
http://twitter.com/#!/perlcodesample/status/97162783644319744