3

したがって、次のコードは私を少し悩ませています:

    $stm = $pdo->prepare("SELECT * FROM urls WHERE account=? AND NOT deleted LIMIT ?, 4");
    $stm->execute($user, ($request-1)*4);

このクエリを実行するたびに、次のエラーが返されます。

Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0', 4' at line 1'

調べてみると、? を使用しているようです。bindParam で指定しない限り、placeholders は自動的に引用符で囲みます。bingparam 関数を使用せずにこれを修正する方法はありますか?

4

1 に答える 1

4

limitこれは既知の問題であり、バインドされたパラメーターで を実際に使用すべきではない理由です。ただし、パラメーターを個別にバインドして int という名前を付けることで、これを克服できます。

$stm = $pdo->prepare("SELECT * FROM urls WHERE account=? AND NOT deleted LIMIT ?, 4");
$stm->bindValue(1, $user);
$stm->bindValue(2, ($request-1)*4), PDO::PARAM_INT);
$stm->execute();

読んだ場合PDOStatement::execute()、実行時にバインドすると、すべてのパラメーターが文字列としてバインドされるために発生します。

Your Common Senseが指摘したように、エミュレーション モードを無効にして、MySQL にプレースホルダーを自動的に並べ替えることができます。

$pdo->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );

または、intvalor を int に型キャストし、それをステートメント内に直接配置することもできます。

于 2013-04-13T03:55:16.567 に答える