PEAR::MDB2_Driver_mysqliとSJIS

PEAR::MDB2のmysqliドライバを使用してキャラクタセットにSJISを使う時の注意。

SET NAMES sjis;

上記SQLの発行だけだと(cp932でも)プレースホルダのエスケープが上手く行われない場合がある。問題が起こるのはプレースホルダの引数に渡した文字の最終文字が特定の文字の場合。

以下の文字が該当し共通点は2バイト目が0×5c(ASCIIコードのに該当)なのでSQLのエスケープ処理で「’」によって囲まれても「’」自体がエスケープされてしまいsyntax errorになる。

― ソ Ы ? 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄
喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 ? 薌 硃 菑

mysqliにはmysqli_set_charset系のクライアントキャラクタセットを変更する関数・メソッドが用意されていて、それを利用しキャラクタセットを変更すればmysqli_real_escape_string関数が正しく2バイト目を判別するようになる。

変更にはmysqli接続オブジェクトが必要になるので取得して変更。

/**
 * @var $mdb2 MDB2
 */
$mdb2->getConnection()->set_charset('sjis');

これで上の文字列が通れば大丈夫。MDB2.phpの読み込み重い・・・。