3

問題を見つけることができない PDO 準備済みステートメントを介してクエリを実行すると、奇妙な問題が発生します。クエリを手動で実行すると、問題なく動作します。コードは次のとおりです (簡潔にするために簡略化しています)。

// Query Parameters
$params = array( 1, 5 );

// Get Products
$query = "SELECT * FROM mydb.Product
          WHERE ProductId >= ?
            AND IsApproved = 1
            AND IsPublic = 1
          LIMIT ?";

// Get Database Instance
$dbh = App\App::getDatabase()->getInstance();

// Prepare Query
if( $stmt = $dbh->prepare($query) )
{
   if( $stmt->execute($params) )
   {
       // Return Records
   }
}

クエリからその部分を削除するLIMIT ?と、期待どおりにすべての結果が返されます。代わりに、LIMIT を使用しようとして値として5を渡すと、次のエラーが発生します。

SQL 構文にエラーがあります。5 行目の ''5'' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

準備後のPDOStatementオブジェクトのダンプは次を示します。

object(PDOStatement)[59]
    public 'queryString' => string 'SELECT * FROM mydb.Product
       WHERE ProductId >= ?
       AND IsApproved = 1
       AND IsPublic = 1
       LIMIT ?'

クエリの最後にセミコロンを入れてみましたが、同じエラーが発生します。私は脳内鼓腸を患っており、明らかな何かが欠けていますか?


TL;DR; 1064 エラーで LIMIT 句を使用すると、準備済みステートメントが失敗するのはなぜですか?

4

2 に答える 2

3

これはPDO Mysql Syntax error 1064の重複である可能性があると思います

解決策は、制限パラメーターをバインドして、単純な (int) キャストの文字列ではなく int に強制することです。

于 2013-09-10T15:09:20.610 に答える