会社と自宅とでMySQL+PHPの環境で遊んでいたりするけれど、ちょっとした環境の違いでハマってしまったのでメモ。
PHP5.0.4+MySQL4.1.12ではプリペアードステートメントで、SELECT文のLIMITのパラメータに'?'を使うとパースエラーでmysqli_prepare()がFALSEになる。(ただしmysql_error()などでエラーコードを取っても0(正常)が返るようだ)
このコードだとif文の条件が偽になる。
$conn = mysqli_connect('localhost','user','pass');
$query = 'SELECT name FROM tb_name ORDER BY name LIMIT ?,?';
if($stmt = mysqli_prepare($conn,$query)){
mysqli_bind_param($stmt,'ii',$start,$end);
mysqli_execute($stmt);mysqli_bind_result($stmt,$name);
while (mysqli_fetch($stmt)){
array_push($array,$name);
}
mysqli_stmt_close($stmt);} else {
echo "Statement Error.\n";
}
ただし、MySQL5.0.9betaだとこのコードは正しく動く。
レコード数の多いデータを例えば1ページ10件ずつ表示してページ切り替えしたいときに、LIMITを使って取得するレコードの範囲を選ぶことってあるような気がするんだけど、プリペアードステートメントが使えないのか…。
最初にMySQL5.0の環境でコードを書いていたから気づかなかったよ…。
コメント