miau's blog?

DB_DataObject の escape()

思い切り誤解してた。

マニュアルに、

Similar to Pear DB's quote it will escape a value, without the quotes,
so it can be used with a LIKE query.

って書いてるんだけど、LIKE で使う「%」や「_」はエスケープしてくれない。
自前でエスケープするしかないっぽい。


(追記)
さらに誤解してた。
PostgreSQL では LIKE のエスケープ文字がデフォルトで「\」になってるので、わざわざ ESCAPE '〜' とか書かなくていい。つまり、「%」を検索するには hoge LIKE '%\%%' と書けばいい、と。ここまではマニュアルでちゃんと読んでた。

でも、「\」自身を検索するには、hoge LIKE '%\\\\%' と「\」を 4 つ繰り返す必要があるらしい。ここ、ちゃんとマニュアルに書いてたんけど、見落としてた。(テストのときに初めて気づいた)
よく考えると、シングルクォート文字列の解析フェーズと LIKE パターンの解析フェーズが別なので、二回エスケープが必要に決まってる。

そんなわけで、

$hoge = mb_ereg_replace('\\\\', '\\\\', $hoge);
$hoge = mb_ereg_replace('%', '\\%', $hoge);
$hoge = mb_ereg_replace('_', '\\_', $hoge);

$tbl->whereAdd("hoge LIKE " . $tbl->escape($hoge) . ");

みたいな処理になる、と。
'\\\\' を '\\\\' に置換してるように見えるけど、ここも第1引数がパターンを表すのに対して、第2引数が普通の文字列を表すからこうする、と。ここもハマった。

posted at 12:12:00 on 2006-09-08 by miau - Category: General No Trackbacks - Permalink

TrackBack

このエントリにトラックバックはありません
現在トラックバックは受け付けていません。

Comments

ma wrote:

この中途半端加減が半端ないよね。
私はDB_DataObjectが大嫌いなので使わないけど。
2006-09-09 12:48:40

miau wrote:

最近は PHP で使える O/R マッピングっぽいモジュールも増えてますし、さっさと見切りつけたほうがいいかもしれませんね。
そもそも O/R マッピングが本当に必要かって話ですが・・・。
2006-09-11 11:26:02

Add Comments

現在コメントは受け付けていません。
お手数ですが、 こちら のコメント欄にでも記載していただければと思います。