さくらレン鯖でMDB2のquote,escapeメソッドでエスケープ処理時に文字化けする
なぜか分からない。
文字コードはほぼ全てUTF-8に統一してるはず。
DBへの接続時に「SET NAMES utf8」で文字コードも明示的に指定してる。
<?php require_once "MDB2.php"; $dsn=array("phptype"=>"mysql","username"=>"***","password"=>"***","hostspec"=>"mysql***.db.sakura.ne.jp","database"=>"***"); $db=MDB2::singleton($dsn); $db->query("SET NAMES utf8"); } $txt = $db->quote("さんし'ゃいん","text"); //[さんし\'ゃいん]と変換されればOK print $txt; ?>
実際の出力
'\さ\ん\'\し\ゃ\ん'
あれれ。
余計なところにバックスラッシュが入ったり、エスケープする文字によってははたまた文字化けしたり。
色々試してみました。
ddhostのサーバーで同じテストコードを実行。こちらはすんなり変換してくれました。
phpinfo()でPHPの設定を両者比較。
文字化けするさくらレン鯖でmagic_quotes_gpcの項目がOnになってる。
コレは習慣としてOffにしておく必要がある設定項目です。
他所さんの記事でもOffにしろ!と良く見かけます。
Get/Post/Cookieで勝手にエスケープしちゃうんですよね。
自分でしないで済むんだからいいじゃない!と思いがちでしょうがコレが逆に怖いんです。
今回はGetやPostなどユーザーからの入力値を処理するわけでなく直接変数に入れた値のエスケープ処理なのでこれは関係ありませんでした。
今度はMDB2のパッケージとMysqlのドライバを最新版に。
したけど変化なし。
ファイルの文字コードをShift-jisで保存して実行もしてみましたが。。。ダメ。
mixiのコミュにも質問を投下しました。そこで頂いた回答の中に、
そう言えばEUCでは試してない。早速。。。
結果、大当たり。
結局文字コードかよ!
文字化けっぽいことになってるんだから文字コードなのは当たり前ですけども!
でもメソッド実行前に$db->query("SET NAMES utf8");してるよなぁ。
でも化ける。どこの文字コードの設定がまだEUCになってるんだろ。
php.iniで設定すべきところは全てutf8にしてある。
となると、やはり疑うべきはMysql?
早速確認。
大抵の項目はデフォルトのujisからUTF-8に指定しなおしてます。
character set server・・・・ ujis
collation database・・・・・ ujis_japanese_ci
collation server・・・・・・ ujis_japanese_ci
コレか!?これなのか?
MySQL日本語の旅 | OSS-Web
http://oss.timedia.co.jp/show/MySQL%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%81%ae%e6%97%85
↑のサイトを参考に手直し。
set collation database = "utf8_general_ci" と set collation_server = "utf8_general_ci"を実行してみてみる。
・・・反映されてない。
さて、どうしたものか・・・