PHP5とMySQL4.1とLIMIT

会社と自宅とで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の環境でコードを書いていたから気づかなかったよ…。

タイトルとURLをコピーしました