Mysql
 sql >> база данни >  >> RDS >> Mysql

PHP - Използване на PDO с масив от клаузи IN

PDO не е добър с такива неща. Трябва да създадете динамично низ с заместители и да го вмъкнете в заявката, докато обвързвате стойностите на масива по обичайния начин. С позиционни заместители би било така:

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

В случай, че има други заместители в заявката, можете да използвате следния подход (кодът е взет от моя урок за PDO ):

Можете да използвате array_merge() функция за обединяване на всички променливи в един масив, добавяйки другите ви променливи под формата на масиви, в реда, в който се появяват във вашата заявка:

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

В случай, че използвате именувани заместители, кодът би бил малко по-сложен, тъй като трябва да създадете последователност от наименувани заместители, напр. :id0,:id1,:id2 . Така че кодът ще бъде:

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

За щастие, за посочените заместители не е нужно да следваме стриктния ред, така че можем да обединим нашите масиви в произволен ред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да деактивирате строг SQL режим в MySQL 5.7

  2. Изберете 3-те най-скорошни записа, където стойностите на една колона са различни

  3. Как да настроите отдалечена MySQL връзка

  4. Безопасно ли е да съхранявате потребителски имена и пароли в базата данни?

  5. Разрешени ли са вложени транзакции в MySQL?