文字列のエスケープを簡単に

本家の日記データが現在、ファイルにログを取ってる状態な訳だがそろそろそれに限界を感じでPostgreSQLにデータを移したシステムに変換するメンテナンス中
MySQLでもいいんだけど、個人的にPostgreSQLに惚れたからPostgreSQL

で、日記だから文字列が本命な訳で…エスケープシーケンスが問題になってきた
自力で差し替え用のスクリプト組んで、差し替えフォーマットを定義してたんだがそろそろ限界
そこでこんな関数を利用してみた

pg_escape_string();

pg_escape_stringは渡されたStringをPostgreSQLフォーマットにエスケープしてくれる憂い奴
…マジックコーテーションの例があるから、それが全てでは無いだろうがそれはそれで個別に対応しよう
関数のフォーマットは以下の通り

string pg_escape_string  ([ resource $connection  ], string $data  )

$connectionはPostgreSQLの接続リソース。こいつを渡さない場合は、デフォルトの接続が利用されるそうだ
デフォルトの接続とは、直近の接続の事らしい。要するに最後に接続した設定で接続するそうな
…どういう判定してるんだろう

$dataは引き渡すデータ。無論String型で
…まあphpで型はあんまり意識しないけどさorz

戻り値はエスケープされたStringデータ

早速実験してみよう
こんなスクリプトを動かす

<?php
	$str="エスケープ'できるかな?";
	
	$escape_str=pg_escape_string($str);
	echo $str."\r\n";
	echo $escape_str;
?>

めんどいから接続は直近利用する
実行するとこんな感じで帰ってきた

エスケープ'できるかな?
エスケープ''できるかな?

おおー
エスケープされてますな
ちなみに、渡す値をnullにしてもエラーは出てこなかった。ドキュメントには明記されていないが、その場合はFALSEが返される様子


最後に注意点(と、まとめ)

PostgreSQL 7.2以降でしか対応して無い
要するにこの変数はDBに接続して「この文字列エスケープしてクレー」と送ってる訳だ

あくまでもこの変数はString型の自動エスケープ
バイナリとかの場合にはpg_escape_byteaを利用するべし
両方混在してる場合にはどうなるんだろうね?

null渡すとFALSEが返されるみたい

明記しないと直近の接続利用するんで、オープンなスクリプトの場合にはしっかり接続リソース指定する事

addslashesを利用するのも良いけど、こちらの方が推奨されてるらしい

エスケープ済みの場合には更にエスケープとか楽しい事になる

・追記(2/28)
何か、接続リソース渡したらエラーが出ている…。バージョンの問題らしいorz
接続リソースが定義されているのはバージョン5.2.0から
PCに入ってるの5.1.2だったorz
その所為なのか、何なのか多くのコーディングが接続リソースを使用していない。あー、これがジェネレーションギャップか…(大いに違う