Hal penting pertama yang harus dikatakan adalah bahwa Anda bisa menyisipkan beberapa baris berkat hanya satu INSERT
permintaan
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...
Setelah Anda mengetahuinya, Anda bisa mendapatkan solusi yang baik dengan PDO (misalnya).
Anda harus ingat bahwa Anda ingin prepare
yang lengkap dan execute
proses (dalam hal keamanan, Anda harus melewati setiap parameter secara terpisah).
Katakanlah Anda memiliki baris untuk disisipkan terstruktur sebagai berikut:
$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 ...
);
Sasaran Anda adalah menjadikan hasil ini sebagai kueri yang disiapkan :
INSERT INTO Table (col1, col2, col3)
VALUES (?, ?, ?),
(?, ?, ?),
(?, ?, ?)
Dengan yang sesuai eksekusi :
PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));
Ya, Anda hanya harus melakukannya sekarang:
$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);
Dan... Itu dia!
Dengan cara ini, setiap param diperlakukan secara terpisah, yang Anda inginkan (keamanan, keamanan, keamanan!) dan semuanya, secara dinamis, hanya dengan satu INSERT
permintaan
Jika Anda memiliki terlalu banyak baris untuk disisipkan (lihat ini
), Anda harus execute
satu per satu
$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);
}