1

クライアントから送信された配列に基づいてデータベースをクエリするために、phpに次のコードがあります。

$limit = $_POST['limit'];
$userArray = json_decode($_POST['arr'], true);
$queryPlaceholders= implode(',', array_fill(0,count($userArray), '?'));
$stmt = $db->prepare("SELECT * FROM tableA
                          WHERE tableA.id IN (".$queryPlaceholders.")
                          LIMIT ?");
foreach($userArray as $k => $val){
    $stmt->bindParam(($k+1), $val);
}
$stmt->bindValue(count($userArray) + 1, (int)trim($limit), PDO::PARAM_INT);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo $result;

このコードにはエラーがあるようです。値11と17を含む配列を送信すると、クエリは値17でのみ実行され、11と17の両方では実行されないように見えます。

print_r($userArray)が得たらArray ( [0] => 11 [1] => 17 )

だから私はphpが正しい配列を持っていることを知っています。ただし、上記のコードを使用してこのクエリを実行し、以下のクエリを実行すると、異なる回答が得られます。

SELECT * FROM tableA
WHERE tableA.id IN (11,17)
LIMIT 10

上記のコードを実行すると、実際にこのクエリを実行しているように見えますか?

SELECT * FROM tableA
WHERE tableA.id IN (17)
LIMIT 10

foreachまた、配列の両方の要素(11と17)が$stmtにバインドされていることを通知するステートメントをループに配置しました

4

1 に答える 1

3

問題は、あなたが使用していることですbindParam():

PHP 変数を、ステートメントの準備に使用された SQL ステートメント内の対応する名前付きプレースホルダーまたは疑問符プレースホルダーにバインドします。とは異なりPDOStatement::bindValue()、変数は参照としてバインドされ、PDOStatement::execute()呼び出されたときにのみ評価されます。

$valはループの反復ごとに変更されるためforeach、クエリが最終的に実行されるとき、最終的には各プレースホルダーで同じになります。

于 2012-10-12T11:16:04.173 に答える