SQLのワイルドカードエスケープについて
ワード検索などのSQLで、LIKE文を使用する際のワイルドカード文字のエスケープについて。
KohanaのDatabaseモジュールには、ワイルドカードをエスケープしてくれません。ソースコードを覗いてみると、
<?php /** * Kohana 3.0.x の database モジュールより */ class Kohana_Database_MySQL extends Database { public function escape($value) { // Make sure the database is connected $this->_connection or $this->connect(); if (($value = mysql_real_escape_string((string) $value, $this->_connection)) === FALSE) { throw new Database_Exception(':error', array(':error' => mysql_errno($this->_connection)), mysql_error($this->_connection)); } // SQL standard is to use single-quotes for all values return "'$value'"; }
となっています。単純に mysql_real_escape_string() を利用しているだけのようです。
mysql_real_escape_string() は % や _ をエスケープしないので、例えば、% で検索した場合、
SELECT * FROM users WHERE user_name LIKE '%%%';
となってしまいます。
<?php $wildcards = array('%', '_'); $escape_pattern = '\\'; foreach ($wildcards as $wildcard) { $text = str_replace($wildcard, $escape_pattern . $wildcard, $text); }
という処理をすると、
SELECT * FROM users WHERE user_name LIKE '%\%%';
となります。
Database モジュール関連を見てみたのですが、それっぽいメソッドが用意されてないようです。見落としてるんですかね。
CodeIgniter ではエスケープ処理がちゃんとされているようです。