1

ID のカンマ区切りのリストを準備済みステートメントにバインドすると、3 行が返されると予想していましたが、1 行しか返されません。

<?php

$dbh = new PDO("mysql:host=127.0.0.1;dbname=database", "user", "password");
$stmt = $dbh->prepare('SELECT * FROM Person WHERE PersonID IN (:p)');
$stmt->bindValue(":p", "3,4,5");
$stmt->execute();
$result =  $stmt->fetchAll(PDO::FETCH_ASSOC);

?>

<pre>
<?php print_r($result); ?>
</pre>

stmtをに変更すると

SELECT * FROM Person WHERE PersonID IN (3,4,5)

期待どおりに 3 行返されました。混乱しています。

4

2 に答える 2

3

bind は本質的にそれを引用符で囲み、単一の値として扱うためです。その後、MySQL はそれを整数に戻すため、最初の項目の一致を見つけます。

IN (:p1, :p2, :p3) を実行し、値をそれぞれ個別にバインドする必要があります

于 2012-08-29T04:53:18.837 に答える
2

これは機能するはずです。ステートメントで使用する必要があるプレースホルダーを動的に構築します。

$idList = array(3, 4, 5);
$argList = join(',', array_fill(0, count($idList), '?'));

$stmt = $dbh->prepare("SELECT * FROM Person WHERE PersonID IN ($argList)");
$stmt->execute($idList);
$result =  $stmt->fetchAll(PDO::FETCH_ASSOC);
于 2012-08-29T05:12:00.527 に答える