ele_eel's diary

プログラムの事を少しと、デジタル系買物記。

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 '%%%';

となってしまいます。

そこで、PEAR::MDB2のエスケープ処理を参考に

<?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 ではエスケープ処理がちゃんとされているようです。