PHPに惚れました

今でも多分惚れてます。

さくらレン鯖でMDB2のquote,escapeメソッドでエスケープ処理時に文字化けする#3(解決)

PEARMDB2パッケージを使用した際、escape,quoteメソッドで文字化けが発生。
それの解決メモ。
環境:さくらインターネット - Standardプラン

DBの文字コード周辺の設定値
character set client utf8
(グローバル値) ujis
character set connection utf8
(グローバル値) ujis
character set database ujis
character set filesystem binary
character set results utf8
(グローバル値) ujis
character set server ujis
character set system utf8
collation connection utf8_general_ci
(グローバル値) ujis_japanese_ci
collation database ujis_japanese_ci
collation server ujis_japanese_ci

<?php
//修正前
require_once ("MDB2.php");

$dsn = array(
    'phptype'  => "mysql",
    'username' => "***",
    'password' => "***",
    'hostspec' => "***",
    'database' => "***",
);
$db=MDB2::singleton($dsn);
$db->query("SET NAMES utf8");

print $db->escape("さんし'ゃいん",true);   //'\さ\ん\'\し\ゃ\い\ん' 文字化け・・・
?>

色々調べてみると「SET NAMES utf8」での文字コード指定は非推奨らしい。
mysql_set_charset("utf8"); で指定しなさいと書いてあった。

MDB2PHPのバージョンやmysql項目の設定が整っていて、MDB2_Driver_mysqlのバージョンが1.5以上ならば内部的にmysql_set_charset(); を実行してくれる。
整っていなければSet Namesで文字コードが設定される。

早速MDB2_Driver_mysqlのバージョンが1.4台だったのでバージョンアップ。
これで環境は整った。と思ってさっきのコードを実行してみたが。。。文字化けは直らず。

mysql_client_encodingで確認してみるとujisのまま。

<?php
//修正前
require_once ("MDB2.php");

$dsn = array(
    'phptype'  => "mysql",
    'username' => "***",
    'password' => "***",
    'hostspec' => "***",
    'database' => "***",
);
$db=MDB2::singleton($dsn);
$db->query("SET NAMES utf8");
mysql_set_charset("utf8");

print $db->escape("さんし'ゃいん",true);   //'さんし\'ゃいん'  //直った!!けどなんだかなぁ。
?>

更に色々調べてみるとdsnの設定を配列じゃなくて文字列設定している記事が比較的多い。
真似して以下のように修正。

<?php
//修正後
require_once ("MDB2.php");
$dsn = 'mysql://user:pass@hostspec/dbname?charset=utf8';
$db=MDB2::singleton($dsn);

print $db->escape("さんし'ゃいん",true);   //'さんし\'ゃいん'  //直った!!
?>

結論:

    • MDB2_Driver_mysqlのバージョンは1.5以上
    • dsnの指定は配列ではなく文字列形式

こんなところでしょうか?