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

Pocket

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

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

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

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

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

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

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

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

<br />
echo $res-&gt;getMessage() . &quot;\n&quot;;<br />
echo $res-&gt;getDebugInfo() . &quot;\n&quot;;<br />

すると・・・
何かクエリーがおかしいとのこと。
<br />
MDB2 Error: syntax error<br />
_skipDelimitedStrings: [Error message: query with an unterminated text string specified]<br />
[Last executed query: DEALLOCATE PREPARE mdb2_statement_pgsql_xxxxxxxxxxxxxxxxxxxxxxxxx]<br />

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

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

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

コメントを残す