PDO is niet goed met zulke dingen. U moet dynamisch een tekenreeks met tijdelijke aanduidingen maken en deze in de query invoegen, terwijl u arraywaarden op de gebruikelijke manier bindt. Met positionele tijdelijke aanduidingen zou het als volgt zijn:
$in = str_repeat('?,', count($in_array) - 1) . '?';
$sql = "SELECT * FROM my_table WHERE my_value IN ($in)";
$stm = $db->prepare($sql);
$stm->execute($in_array);
$data = $stm->fetchAll();
Als er andere tijdelijke aanduidingen in de zoekopdracht zijn, kunt u de volgende aanpak gebruiken (de code is afkomstig uit mijn BOB-tutorial ):
Je zou array_merge()
. kunnen gebruiken functie om alle variabelen samen te voegen tot een enkele array, en uw andere variabelen toe te voegen in de vorm van arrays, in de volgorde waarin ze in uw zoekopdracht verschijnen:
$arr = [1,2,3];
$in = str_repeat('?,', count($arr) - 1) . '?';
$sql = "SELECT * FROM table WHERE foo=? AND column IN ($in) AND bar=? AND baz=?";
$stm = $db->prepare($sql);
$params = array_merge([$foo], $arr, [$bar, $baz]);
$stm->execute($params);
$data = $stm->fetchAll();
Als u benoemde tijdelijke aanduidingen gebruikt, zou de code iets ingewikkelder zijn, omdat u een reeks van benoemde tijdelijke aanduidingen moet maken, b.v. :id0,:id1,:id2
. Dus de code zou zijn:
// other parameters that are going into query
$params = ["foo" => "foo", "bar" => "bar"];
$ids = [1,2,3];
$in = "";
$i = 0; // we are using an external counter
// because the actual array keys could be dangerous
foreach ($ids as $item)
{
$key = ":id".$i++;
$in .= ($in ? "," : "") . $key; // :id0,:id1,:id2
$in_params[$key] = $item; // collecting values into a key-value array
}
$sql = "SELECT * FROM table WHERE foo=:foo AND id IN ($in) AND bar=:bar";
$stm = $db->prepare($sql);
$stm->execute(array_merge($params,$in_params)); // just merge two arrays
$data = $stm->fetchAll();
Gelukkig hoeven we voor de genoemde tijdelijke aanduidingen niet de strikte volgorde te volgen, dus we kunnen onze arrays in elke volgorde samenvoegen.