Pierwszą ważną rzeczą do powiedzenia jest to, że możesz wstawiaj wiele wierszy dzięki tylko jednemu INSERT
zapytanie
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...
Kiedy już to wiesz, będziesz w stanie uzyskać dobre rozwiązanie z PDO (na przykład).
Musisz pamiętać, że chcesz kompletnego prepare
i execute
proces (ze względów bezpieczeństwa każdy parametr należy przekazać osobno).
Załóżmy, że masz wiersze do wstawienia w następujący sposób:
$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 ...
);
Twoim celem jest uzyskanie tego wyniku jako przygotowanego zapytania :
INSERT INTO Table (col1, col2, col3)
VALUES (?, ?, ?),
(?, ?, ?),
(?, ?, ?)
Z odpowiednim wykonaniem :
PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));
Cóż, tylko muszę to zrobić teraz:
$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);
I... to wszystko!
W ten sposób każdy parametr jest traktowany osobno, czego chcesz (bezpieczeństwo, bezpieczeństwo, bezpieczeństwo!) i wszystko to w sposób dynamiczny, z tylko jednym INSERT
zapytanie
Jeśli masz zbyt wiele wierszy do wstawienia (zobacz to
), powinieneś execute
jeden po drugim
$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);
}