CakePHPとDBの文字コードを別にする方法
cakeはUTF-8のままにしときたいけど、DBはSJISじゃないとダメな場合があったので。
単純に、モデルのbeforeFind、AfterFindなどを使ってエンコードを変換する。
うまくいったように見えるけど、ホントにこれでいいかはわかりません。
MySQLとかなら、DATABASE_CONFIGクラスの設定をするだけでいいかもしれない。
<?php class AppModel extends Model { function beforeFind($queryData) { // クエリパラメータの配列を、DB文字コードに変換 array_walk_recursive($queryData, array($this, 'encodeToDbEncoding')); return $queryData; } function afterFind($results, $primary = false) { // 取得結果の配列を、内部文字コードに変換 array_walk_recursive($results, array($this, 'decodeFromDbEncoding')); return $results; } function beforeSave($options = array()) { // saveするデータの配列を、DB文字コードに変換 array_walk_recursive($this->data, array($this, 'encodeToDbEncoding')); return true; } function query() { // Model::queryは可変の引数をとるので同じようオーバーライドにする $params = func_get_args(); array_walk_recursive($params, array($this, 'encodeToDbEncoding')); $results = call_user_func_array(array('Model', 'query'), $params); if (is_array($results)) { $results = $this->afterFind($results); } return $results; } function encodeToDbEncoding(&$value, $key) { if (is_string($value)) { $value = mb_convert_encoding($value, 'SJIS', Configure::read('App.encoding')); } } function decodeFromDbEncoding(&$value, $key) { if (is_string($value)) { $value = mb_convert_encoding($value, Configure::read('App.encoding'), 'SJIS'); } } }
※追記
mb_convert_variablesって関数があるので文字コード変換はそれつかったほうがいいです