0

ユーザーがデータベースの次の10行を取得するはずのボタンを押すたびに、ajaxリクエストを介して呼び出されるphpスクリプトがあります。ボタンが押されても何も起こらず、コンソールまたはphpからエラーは発生しません

$query = $conn->prepare('SELECT name, file_loc, img_id, filter, votes FROM images WHERE user_id=? ORDER BY votes DESC LIMIT ?, 10');
$query->execute(array($user_id, $skip));
$result = $query->fetchAll();

phpmyadmin に移動し、変数を手動で入力してクエリを直接実行すると、正しく実行されます。

スクリプトの最後に追加するときのphpではecho $skip . ' ' . $user_id;、すべての変数が本来あるべきものであることを示しています。さらに、クエリの末尾を編集して、変数を read にプラグインする代わりに静的な数値を使用するとLIMIT 10, 10、すべて正常に機能します (変数ではありませんが、10 ずつインクリメントすることはできません)。

これが適切に実行されない理由はわかりませんが、明らかなことを見落としているように感じます。何か案は?

4

2 に答える 2

1

エミュレーション モード (デフォルトでオン) の場合、PDO はプレースホルダーを実際のデータに置き換えます。また、「遅延」バインディングを使用すると、PDO はすべてのパラメーターを文字列として扱います。
その結果、クエリは次のようになります。

LIMIT '10', 10

これは明らかに間違った構文であり、クエリが失敗します。


エミュレーションをオフにする (mysql はすべてのプレースホルダーを適切にソートできるため)
または、Kalpesh の回答のように数値を明示的にバインドするという2 つの解決策があります。ただし、この変数に適切な型 (PDO::PARAM_INT) を設定することを忘れないでください。

エミュレーションをオフにするには、接続後にこのコードを実行します

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

また、エラーを取得するには、これを追加します

$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
于 2013-02-04T20:05:01.867 に答える
0

これを試すことができますか?

$query = $conn->prepare('SELECT name, file_loc, img_id, filter, votes FROM images WHERE user_id=? ORDER BY votes DESC LIMIT ?, 10');
$query->bindParam(1, $user_id);
$query->bindParam(2, $skip);
$query->execute();
$result = $query->fetchAll();
于 2013-02-04T19:47:10.113 に答える