|
カテゴリ:PHP
先日、LIKEのワイルドカードである_と%はmysql_escape_string()ではエスケープされないとかきました。
ではどう対応するか。 str_replace(array('_','%'),array('\_','\%'),$str) こんな感じで置き換えると良いみたいな記事もありましたが、マルチバイト(特にSJIS?)だと誤認知される可能性があるっぽい。 仕方が無いのでちょっとカッコ悪いけど個別に置き換えた。 あと、円マーク(バックスラッシュ)はLIKEで使う際には2重化してあげないといけない。 つまり\を検索しようとするなら、LIKE文の中では「\\\\」となる。 \n(改行コード)を検索するなら「\\n」だが、\nという文字列を検索するなら「\\\\n」となる。 これについてはマニュアルの注記あたりを参照 http://dev.mysql.com/doc/refman/5.1/ja/string-comparison-functions.html LIKEで使用し、ワイルドカードや改行コードを許容せず全てエスケープ処理ならこんな感じ // 値をMySQL用のものでエスケープ処理 $str = mysql_real_escape_string($str); // LIKEで使われるワイルドカード(%)をエスケープ処理 $str = mb_ereg_replace('%','\%',$str); // LIKEで使われるワイルドカード(_)をエスケープ処理 $str = mb_ereg_replace('_','\_',$str); // 円マーク(バックスラッシュ)をLIKE用に2重化 $str = mb_ereg_replace('\\\\','\\\\',$str); mb_eregやmb_ereg_replaceで円マークの扱いには注意が必要。 第一引数の「\\\\」は正規表現の為、円マークは2重化され、更に文字列と解釈させるためにもう一度2重化するので、意味的には文字「\」にあたる。 (「\\」だと「\(エスケープ文字)」と解釈され、エスケープ文字だけだよーとエラーが出るかfalseが返ってきた覚えが) 第二引数の「\\\\」は置き換える文字列の為、意味的には「\\」にあたる。 (正規表現ではないので、その分円マークの2重化が1回少ない) つまり文字「\」を文字列「\\」に置き換える処理。 この処理を通すと、%は\\%となる。MySQLのマニュアルには\%という記述があるが、実際は\\%でも\%でも%という文字を検索してくれた。 これについてはどちらかに寄せてもらいたいような気がしなくもない。 今日はエスケープ処理に悩まされた一日でした。 お気に入りの記事を「いいね!」で応援しよう
Last updated
2008.10.16 00:05:42
コメント(0) | コメントを書く
[PHP] カテゴリの最新記事
|