ele_eel's diary

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

SQLワイルドカードエスケープの追記

Database モジュールでワイルドカードのエスケープ処理という件で、KO2 では Database のメソッド like() で処理可能でした。
※KO3はやっぱり見当たらず。

<?php

abstract class Database_Driver {
	/**
	 * Builds a LIKE portion of a query.
	 *
	 * @param   mixed    field name
	 * @param   string   value to match with field
	 * @param   boolean  add wildcards before and after the match
	 * @param   string   clause type (AND or OR)
	 * @param   int      number of likes
	 * @return  string
	 */
	public function like($field, $match, $auto, $type, $num_likes)
	{
		$prefix = ($num_likes == 0) ? '' : $type;

		$match = $this->escape_str($match);

		if ($auto === TRUE)
		{
			// Add the start and end quotes
			$match = '%'.str_replace('%', '\\%', $match).'%';
		}

		return $prefix.' '.$this->escape_column($field).' LIKE \''.$match . '\'';
	}

ただ、スタティックに利用できなかったり、マルチバイトに対応していないので不安です。
そこで マルチバイト対応SQLエスケープ処理をメモ。
KO2 であれば、適当なヘルパーに以下のファンクションを追加して利用。

<?php

	/**
	 * データベース用ワイルドカードエスケイプ
	 *
	 * @param str $str
	 * @return str
	 */
	public static function mb_escape_wildcard($str = '')
	{
		if(is_string($str))
		{
			$wildcards = array('%', '_');
			foreach ($wildcards as $wildcard) {
				$str  = mb_ereg_replace($wildcard, '\\'.$wildcard, $str);
			}
		}
		return $str;
	}

KO3 であれば、Validate クラスを拡張して

<?php

class Validate extends Kohana_Validate {

	/**
	 * simple multi-byte trim filter
	 *
	 * @param str $str
	 * @return str
	 */
	public static function mb_trim($str)
	{
		return mb_ereg_replace('^\s*([\s\S]*?)\s*$', '\1', $str);
	}

	/**
	 * データベース用ワイルドカードエスケイプ
	 *
	 * @param str $str
	 * @return str
	 */
	public static function mb_escape_wildcards($str = '', $wildcards = array('%', '_'))
	{
		if(is_string($str))
		{
			foreach ($wildcards as $wildcard)
			{
				$str  = mb_ereg_replace($wildcard, '\\'.$wildcard, $str);
			}
		}
		return $str;
	}
}

こんな感じで Validate クラスに組み込みました。ついでに、上記の mb_trim() はマルチバイト対応トリムですが、例えば

<?php

//Validate の使用例
$post = Validate::factory($_POST)
		->filter(TRUE, 'Validate::mb_trim')
		->rule('password', 'not_empty')
		->rule('username', 'not_empty');

filter で呼び出すことができます。


それから KO3 でのキャッシュについてですが、以下のスレッドにて解決しました。

Kohana Forums - [KO3] APC Cache
http://forum.kohanaphp.com/comments.php?DiscussionID=4049

Xcache/APC/Eaccelerator は PHPの中間コードのキャッシュや最適化といった機能を持つ拡張モジュールなので、それらをキャッシュとしては利用しないとのこと。
Memcache を利用するなら簡単なんだからラッパを用意するなり、ダイレクトに接続するなりして使えよ、ということらしい。なるほど。