Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

PHP - Sử dụng PDO với mảng mệnh đề IN

PDO không tốt với những thứ như vậy. Bạn cần tạo một chuỗi với trình giữ chỗ động và chèn nó vào truy vấn, trong khi liên kết các giá trị mảng theo cách thông thường. Với trình giữ chỗ vị trí, nó sẽ như thế này:

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

Trong trường hợp có các trình giữ chỗ khác trong truy vấn, bạn có thể sử dụng phương pháp sau (mã được lấy từ hướng dẫn PDO của tôi ):

Bạn có thể sử dụng array_merge() hàm để nối tất cả các biến thành một mảng, thêm các biến khác của bạn ở dạng mảng, theo thứ tự chúng xuất hiện trong truy vấn của bạn:

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

Trong trường hợp bạn đang sử dụng trình giữ chỗ được đặt tên, mã sẽ phức tạp hơn một chút, vì bạn phải tạo một chuỗi các trình giữ chỗ được đặt tên, ví dụ::id0,:id1,:id2 . Vì vậy, mã sẽ là:

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

May mắn thay, đối với các trình giữ chỗ đã đặt tên, chúng tôi không phải tuân theo thứ tự nghiêm ngặt, vì vậy chúng tôi có thể hợp nhất các mảng của mình theo bất kỳ thứ tự nào.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển từ MySQL 5.7 sang MySQL 8.0 - Những điều bạn nên biết

  2. Cách tính tiền ký quỹ trong MySQL

  3. MySQL - Chọn dữ liệu từ nhiều bảng có cùng cấu trúc nhưng dữ liệu khác nhau

  4. Cài đặt WordPress 5 trên ZEIT ngay bây giờ với MySQL Hosting

  5. Làm cách nào để nhập tệp kết xuất MySQL lớn (14 GB) vào cơ sở dữ liệu MySQL mới?