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

Chèn nhiều hàng với các câu lệnh được chuẩn bị sẵn PDO

Điều quan trọng đầu tiên phải nói là bạn có thể chèn nhiều hàng chỉ nhờ một INSERT truy vấn

INSERT INTO Table (col1, col2, col3) 
VALUES ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi')
       -- and so on...

Khi bạn biết điều đó, bạn có thể tìm được giải pháp tốt với PDO (chẳng hạn).
Bạn phải lưu ý rằng bạn muốn có một prepare hoàn chỉnh và execute quy trình (về mặt bảo mật, bạn phải chuyển từng tham số riêng biệt).

Giả sử bạn có các hàng để chèn có cấu trúc như sau:

$rows = array(
              array('abc', 'def', 'ghi'), // row 1 to insert
              array('abc', 'def', 'ghi'), // row 2 to insert
              array('abc', 'def', 'ghi')  // row 3 to insert
              // and so on ...
);

Mục tiêu của bạn là có kết quả này dưới dạng truy vấn được chuẩn bị trước :

INSERT INTO Table (col1, col2, col3) 
VALUES (?, ?, ?),
       (?, ?, ?),
       (?, ?, ?)

Với thực thi tương ứng của nó :

PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));


Chà, bạn chỉ phải làm ngay bây giờ:

$rows = array(
              array('abc', 'def', 'ghi'),
              array('abc', 'def', 'ghi'),
              array('abc', 'def', 'ghi')
);

$row_length = count($rows[0]);
$nb_rows = count($rows);
$length = $nb_rows * $row_length;

/* Fill in chunks with '?' and separate them by group of $row_length */
$args = implode(',', array_map(
                                function($el) { return '('.implode(',', $el).')'; },
                                array_chunk(array_fill(0, $length, '?'), $row_length)
                            ));

$params = array();
foreach($rows as $row)
{
   foreach($row as $value)
   {
      $params[] = $value;
   }
}

$query = "INSERT INTO Table (col1, col2, col3) VALUES ".$args;
$stmt = DB::getInstance()->prepare($query);
$stmt->execute($params);

Và ... Đó là nó!

Bằng cách này, mỗi thông số được xử lý riêng biệt, đó là những gì bạn muốn (bảo mật, bảo mật, bảo mật!) Và tất cả chúng, theo cách động, chỉ với một INSERT truy vấn

Nếu bạn có quá nhiều hàng để chèn (xem this ), bạn nên execute từng cái một

$rows = array(
              array('abc', 'def', 'ghi'), // row 1 to insert
              array('abc', 'def', 'ghi'), // row 2 to insert
              array('abc', 'def', 'ghi')  // row 3 to insert
              // and so on ...
);

$args = array_fill(0, count($rows[0]), '?');

$query = "INSERT INTO Table (col1, col2, col3) VALUES (".implode(',', $args).")";
$stmt = $pdo->prepare($query);

foreach ($rows as $row) 
{
   $stmt->execute($row);
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql để chọn bản ghi theo tháng ngay cả khi dữ liệu không tồn tại

  2. Hiểu về BẢNG TRUNCATE của MySQL bằng các ví dụ thực tế

  3. Cách tạo MySQL máy chủ liên kết

  4. Dấu phân cách trong MySQL

  5. Không thể sử dụng kết nối MySQL cho khung thực thể 6