Het eerste belangrijke dat u moet zeggen, is dat u kunt voeg meerdere rijen in dankzij slechts één INSERT
vraag
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...
Als je dat eenmaal weet, kun je een goede oplossing krijgen met bijvoorbeeld PDO.
Je moet er rekening mee houden dat je een volledige prepare
wilt hebben en execute
proces (in termen van veiligheid moet u elke parameter afzonderlijk doorgeven).
Stel dat u rijen moet invoegen die als volgt gestructureerd zijn:
$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 ...
);
Uw doel is om dit resultaat te hebben als een voorbereide zoekopdracht :
INSERT INTO Table (col1, col2, col3)
VALUES (?, ?, ?),
(?, ?, ?),
(?, ?, ?)
Met de bijbehorende uitvoeren :
PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));
Nou, jij alleen moet het nu doen:
$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);
En... Dat is het!
Op deze manier wordt elke parameter afzonderlijk behandeld, wat u wilt (beveiliging, beveiliging, beveiliging!) en alles, op een dynamische manier, met slechts één INSERT
vraag
Als je te veel rijen hebt om in te voegen (zie dit
), moet u execute
één voor één
$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);
}