フリーなんす

フリーランスエンジニアの色々

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で設定する方法でハマったので備忘。