zend frameworkでmysql の limit への bind でハマった
Mysqlでselect文を書いてlimitを指定して、画面から指定された行数だけ取得して表示〜ん〜軽い軽いと思って
$query = 'SELECT * FROM `table` LIMIT ?';
$param[] = 10;
$sth = $dbh->prepare($query);
$sth->execute($param);
こんな感じでさらっと書いてさらっと実行したらエラー。
えぇぇぇぇと思ってSQL見直したり、コピってphpMyAdminから直接実行させても動くしなんでだ?
と思って調べてたら下ページにいきついた。
ありがたやありがたや。
PHPのPDOでLIMIT句でエラーが発生した時の対処 | SUSH-i LOG
原因としては、LIMIT句に渡す値が文字列として扱われ、最終的に下記のクエリ文となってしまうためです。
SELECT * FROM `table` LIMIT '10';
え〜そこはなんか柔軟に対応してよ〜とか思っちゃうし、解決方法見ても、
$limit = 10;
$query = 'SELECT * FROM `table` LIMIT ?';
$sth = $dbh->prepare( $query );
$sth->bindParam( 1, $limit, PDO::PARAM_INT );
$sth->execute();
いやいやlimitがある時だけ書き方変えるとかちょっとそんな。。。
パラメータいっぱいあったら面倒だしな〜とか思いつつ。
zend framework だと!!!
今使ってるのがzendなんでもうちょい調べてたら、zendでは独自に関数があった!
Zend Framework API Documentation
limit( string $sql, integer $count, integer $offset = 0 ) : string Adds an adapter-specific LIMIT clause to the SELECT statement.
limit関数を使ってやって
$query = 'SELECT * FROM `table` LIMIT ?';
$query = $dbh->limit($query, 10);
$sth = $dbh->prepare($query);
$sth->execute();
こんな感じ!!
これならとりあえずlimitのとこだけ別出しして、他のparamはいつも通り同じ形で書ける!!
limitに取得行数をbindで設定する方法でハマったので備忘。