EthnaでAppObjectを使うときデータベースの文字コードを指定する
えーと、自分のしてる方法が正しいかわからないんですが、サーバ側のDBの文字コードとPHPの内部コーディングやアウトプットの文字コードが違ったりとかすると、ちゃんと指定してないと文字化けが起こったりするんですよね。*1逆に言えばMySQLサーバのデフォルトがUTF8とかでも、EUC-JP使いたければ、文字コードを明示して指定すれば文字化けはしない。と思う(笑)
というわけで、どう使うときにでも文字コードが指定できるようにしたくて。
SET NAMES character_set_name
とやるので、まぁできればこのクエリーを投げたいわけです。ちなみに character_set_name はEUCなら ujis です。間違いやすいですが。
基本的に、DBの入出力はO/RマッピングクラスのAppObjectを使ってるものという前提で、AppObjectのコンストラクタで文字コードをセットするクエリーを投げることにしました。
<? class ProjectID_Sample extends Ethna_AppObject { function ProjectID_Sample(&$backend, $key_type = null, $key = null, $prop = null) { parent::Ethna_AppObject(&$backend, $key_type, $key, $prop); $this->db->query("SET NAMES ujis"); } ...
こうすればAppObjectが呼ばれるたびに文字コードをセットするようになります。ということで。
あーでもどういう風に実装するのが一番楽なのかが微妙。この場合、AppObjectの数だけこの作業が必要になってしまうわけで。。
どうせだったら、Controllerで指定するDBクラスで
<? ... var $class = array( ... 'db' => 'MyEthna_DB_PEAR', //'db' => 'Ethna_DB_PEAR', ...
とかして、このMyEthna_DB_PEARてクラスのコンストラクタで文字コード決めてあげればいいのかな。そしたら getDB でとってきたときも AppObject つかったときも、SET NAMES されるかなー??とか。。
とりあえずは文字化け直った。
まぁとりあえずAppObject使う前提でいこうと思います。