MDB2 でprepare()、 execute() 実行したらエラー

Pocket

MDB2 を使うのって、どのデータベースでも汎用的に使えるようにしたい! っていうのがありますよね。
現在、モバイル用のクローラーを PHP で作っています。
MySQL 用で作ったのですが、他のデータベースでも使えるように MDB2 で作っていました。
PostgreSQLで実験していたら、getAll() で問題が。

元々、MySQL で下のようなコードを plugin/mysql.php に書いてました。

$sql = "SELECT CONCAT(ReqScheme,'://',ReqHost,ReqPath,( CASE WHEN LENGTH(ReqParam) = 0 THEN '' ELSE CONCAT('?',ReqParam) END)) AS Uri FROM RequestReserve WHERE CrawlCode = 0 AND CrawlVersion = ?";
$res =& $db->getAll($sql,null,array($crawlVersion),array("integer"));

crawlVersion は、いつクロールしたかの ID です。
これは問題なく動いていました。

これを PostgreSQL で下記のようなコードを plugin/pgsql.php に書きました。

$sql = "SELECT (ReqScheme || '://' || ReqHost || ReqPath || ( CASE WHEN LENGTH(ReqParam) = 0 THEN '' ELSE '?' || ReqParam END)) AS Uri FROM RequestReserve WHERE CrawlCode = 0 AND CrawlVersion = ?";
$res =& $db->getAll($sql,null,array($crawlVersion),array("integer"));

するとエラーになります。

デバッグとして、下記のコードを加えて実行しました。

echo $res->getMessage() . "\n";
echo $res->getDebugInfo() . "\n";

すると・・・
何かクエリーがおかしいとのこと。

MDB2 Error: syntax error
_skipDelimitedStrings: [Error message: query with an unterminated text string specified]
[Last executed query: DEALLOCATE PREPARE mdb2_statement_pgsql_xxxxxxxxxxxxxxxxxxxxxxxxx]

psql で実行すると上手くいくのに、mdb2 を通すと上手く実行できません。
MDB2/Extented.php や MDB2/Driver/pgsql.php を辿っていくと、MDB2/Driver/pgsql.php の prepare でおかしいことになっている。
コードを読むと、エラーメッセージの通り、_skipDelimitedString() を実行している部分で。
MDB2.php 内の _skipDelimitedString() を読んでみたが、 シングルクォートとエラーになるようだ。

今回はコードを直すことで対応した。

$sql = "SELECT (ReqScheme || ? || ReqHost || ReqPath || ( CASE WHEN LENGTH(ReqParam) = 0 THEN ? ELSE ? || ReqParam END)) AS Uri FROM RequestReserve WHERE CrawlCode = 0 AND CrawlVersion = ?";
$res =& $db->getAll($sql,null,array("://","","?",$crawlVersion),array("text","text","text","integer"));

コメントを残す