PHPに惚れました

今でも多分惚れてます。

さくらレン鯖で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だったりしませんか?」

そう言えば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"を実行してみてみる。

・・・反映されてない。

さて、どうしたものか・・・