Archive for 1月, 2014



11
1月

CakePHP 2.xでprepare+executeした時の謎の現象


CakePHP2.xで開発を行っていて、ちょっとばかり複雑なSQLでページング処理を行う必要があっため、以下のようなSQLを書いたのです。

SELECT **** FROM (複雑なSQL) BETWEEN ? AND ? ※executeした値は1と10

本来ならば10件取れるはずが、何故か1件しか取得できないという謎の現象が発生。
※DB上には10件以上のデータが存在しています

当初はSQL文の間違いかと思い、直接SQLを叩いてみたら問題なし。

ひたすらソースコードを追っかけたところ、PDOライブラリのソースまで辿ったところまではexecuteした値はちゃんと渡っているのでますますわからなく・・・

いろいろ試してみて気が付いたのは、executeする値(BETWEENの後ろの値)が「10」や「100」「1000」などとしても「1」としての結果しか返ってこない。

さらに「20」や「30」を指定したらどうなるのか試してみたら今度は「2」と「3」の結果が返ってきたので、どうやら左端1ケタ以外が無視されてしまっているようでした。

PHPのPDOのバグなのかよくわかりませんが、これ以上調査に時間を掛けられないため、prepare+execute方式は諦め、値の正常性を確認する関数を作成してSQLに直接埋め込む形で回避しました。

こんなことに半日も費やしてしまったことがなんだかアホらしくなる。

now loading...