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 を利用するなら簡単なんだからラッパを用意するなり、ダイレクトに接続するなりして使えよ、ということらしい。なるほど。