Đ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);
}