sql >> Databasteknik >  >> RDS >> Mysql

PHP - Använder PDO med IN-klausul array

PDO är inte bra med sådant. Du måste skapa en sträng med platshållare dynamiskt och infoga den i frågan, medan du binder matrisvärden på vanligt sätt. Med positionella platshållare skulle det vara så här:

$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();

Om det finns andra platshållare i frågan kan du använda följande tillvägagångssätt (koden är hämtad från min PDO-handledning ):

Du kan använda array_merge() funktion för att sammanfoga alla variabler till en enda array, lägga till dina andra variabler i form av arrayer, i den ordning de visas i din fråga:

$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();

Om du använder namngivna platshållare skulle koden vara lite mer komplex, eftersom du måste skapa en sekvens av de namngivna platshållarna, t.ex. :id0,:id1,:id2 . Så koden skulle vara:

// 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();

Som tur är behöver vi inte följa den strikta ordningen för de namngivna platshållarna, så vi kan slå samman våra arrayer i valfri ordning.



  1. Hur söker jag JSON-data i MySQL?

  2. Provstorlek och varaktighet för UPPDATERA STATISTIK:Spelar det någon roll?

  3. Justera dina Avg()-resultat i SQLite med nyckelordet DISTINCT

  4. Fullständig MariaDB-kryptering i vila och under transport för maximalt dataskydd - del två