Mysql
 sql >> Baza danych >  >> RDS >> Mysql

PHP — Używanie PDO z tablicą klauzul IN

PDO nie jest dobry z takimi rzeczami. Musisz dynamicznie utworzyć ciąg znaków z symbolami zastępczymi i wstawić go do zapytania, jednocześnie wiążąc wartości tablicy w zwykły sposób. Z pozycyjnymi symbolami zastępczymi wyglądałoby to tak:

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

Jeśli w zapytaniu występują inne symbole zastępcze, możesz użyć następującego podejścia (kod pochodzi z mojego samouczka PDO ):

Możesz użyć array_merge() funkcja łączenia wszystkich zmiennych w jedną tablicę, dodając inne zmienne w postaci tablic, w kolejności, w jakiej pojawiają się w zapytaniu:

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

Jeśli używasz nazwanych symboli zastępczych, kod byłby nieco bardziej złożony, ponieważ musisz utworzyć sekwencję nazwanych symboli zastępczych, np. :id0,:id1,:id2 . Więc kod będzie wyglądał następująco:

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

Na szczęście dla nazwanych symboli zastępczych nie musimy przestrzegać ścisłej kolejności, więc możemy scalać nasze tablice w dowolnej kolejności.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zwrócić listę dostępnych zestawów znaków w MySQL?

  2. Python SQL — jak korzystać z baz danych SQLite, MySQL i PostgreSQL w Pythonie

  3. DATABASE() — pobierz aktualną nazwę bazy danych w MySQL

  4. Jak zresetować hasło root MySQL?

  5. Eksport MySQL do pliku outfile:znaki ucieczki CSV