はIN()条件で使用する値ごとに個別のバインドされたパラメータを追加します。そうすれば、値を区切るコンマは値の一部ではなく、引用符はエスケープされません。配列から値を取得する必要がある場合は、各値に対してbindValue()を呼び出して配列全体を反復処理できます。
$sql = "
SELECT last_ip
FROM accounts
WHERE login IN (:login1, :login2)
";
$pdo = $this->em->getConnection();
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':login1',"acb");
$stmt->bindValue(':login2',"gfh");
$stmt->execute();
$rs = $stmt->fetchAll();
return $rs;
編集:値の数が不明についてのコメントパー
私は上記の私の説明で示唆したように、1の値をループすることができるはずです(彼らは、アレイ内にある仮定) 、および(1もが$stmt->bindValue()
と文字列を返すを呼び出すために$stmt
を使用していることをコールバックでarray_map()を使用することができます)以下の例のように、クエリテキストにパラメータ名を追加するためにimplode()を使用します。
$pdo = $this->em->getConnection();
$parameterNames = array();
foreach ($values as $index => $value) {
$parameterNames[] = ':login'.$index;
}
$sql = "
SELECT last_ip
FROM accounts
WHERE login IN (".implode(', ', $parameterNames).") ";
$stmt = $pdo->prepare($sql);
foreach ($values as $index => $value) {
$stmt->bindValue(':login'.$index, $value);
}
エラーが発生しましたか?あなたはそれを投稿できますか? – Samir
エラーはありません。それは私はそれを怖いです。 – Hanata
@Samir私たちが与えた証拠から、エラーはありませんが、空の配列が返されます。我々が与えられた証拠から、OPのコードによって実行されているクエリは以下のようになります(パラメータ値を手動で置き換えて): 'SELECT last_ip FROM accounts WHERE login IN( '' 'acb' '、' ' gfh '' ');' –