pg_escape_string の罠

 こんなソースがありました。

mb_internal_encoding('EUC-JP');

// DB の文字コードUTF-8コンパイルされている

$sql = "INSERT INTO table (name) VALUES ('".pg_escape_string("司'")."')";

pg_exec("SET client_encoding TO 'EUC-JP'");

pg_exec($sql);

 だめなのね。文字の組み合わせによって、シングルクオートがちゃんとエスケープされないことがある。

 というのも、pg_escape_string() はPostgreSQL のPQescapeString() の呼び出しを代替しているだけだから、スクリプトの内部文字コードではなく接続したDBの文字コードの影響を受ける。

 上記の例ではpg_escape_string() が呼び出されたとき、DB 接続のクライアント文字コードは未指定だから文字列はUTF-8 として扱われてしまう。

 踏まえて、正しくは下記。

mb_internal_encoding('EUC-JP');

// DB の文字コードUTF-8コンパイルされている

pg_exec("SET client_encoding TO 'EUC-JP'");

$sql = "INSERT INTO table (name) VALUES ('".pg_escape_string("司'")."')";

pg_exec($sql);