PDOとMYSQLの組み合わせでLIMITを使う場合の注意点

注意点というほどでも無いかもしれないけど、一度ハマった事があるので・・・。

$sql = "SELECT * FROM example_tbl WHERE name=? age=?";
$sth = $dbh->prepare($sql);
$sth-> execute(array('あいうえお' , 18));

という感じで配列で渡すと非常に手軽だけれど・・・

$sql = "SELECT * FROM example_tbl WHERE name=? age=? LIMIT ?,?";
$sth = $dbh->prepare($sql);
$sth-> execute(array('あいうえお' , 18, 0, 30));

といった感じでLIMITの値を渡すとエラーが出る。
配列で渡す場合、全て文字列として渡すらしく、LIMITに文字列を渡してしまった事が原因らしい。

なので、LIMITを利用する場合、bindValueなどを用いて

$sql = "SELECT * FROM example_tbl WHERE name=? age=? LIMIT ?,?";
$sth = $dbh->prepare($sql);
$sth-> bindValue( 1, $name);
$sth-> bindValue( 2, $age);
$sth-> bindValue( 3, $offS, PDO::PARAM_INT );
$sth-> bindValue( 4, $offL, PDO::PARAM_INT );
$sth-> execute();

という感じで、明示的に数値として渡してやるか、そもそもLIMITに渡す値に数値以外が含まれるはずがないと割り切って、値のチェックを自力で行って予めクエリに組み込んでやるといいかもしれない。

2010年05月01日  タグ:

コメント

  1. murata says:

    こちらのページのおかげで助かりました。
    ありがとうございます。

  2. Anonymous says:

    どうしてもexecute()が失敗してしまい途方にくれていた所、此方のサイトを参考にしてみるとドンピシャでした。
    とても参考になりました。ありがとうございました。

  3. Anonymous says:

    だいぶ前の記事ですが、ちょっと気になったのでコソリとコメント。

    $sth-> bindValue( 3, $offS, PDO::PARAM_INT );
    これ。数値ですよーと指示は出せても、数値にキャストしてくれるわけじゃない。
    もし「出来ないじゃーん!」と思った人は(int)でも付けてキャストしてみることをオススメします。

Leave a Reply