Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Fügen Sie mehrere Zeilen mit vorbereiteten PDO-Anweisungen ein

Das erste, was wichtig ist, ist, dass Sie können mehrere Zeilen einfügen dank nur einer INSERT Abfrage

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...

Wenn Sie das wissen, können Sie beispielsweise mit PDO eine gute Lösung finden.
Sie müssen bedenken, dass Sie eine vollständige prepare wünschen und execute verarbeiten (aus Sicherheitsgründen müssen Sie jeden Parameter einzeln übergeben).

Angenommen, Sie müssen Zeilen einfügen, die wie folgt strukturiert sind:

$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 ...
);

Ihr Ziel ist es, dieses Ergebnis als vorbereitete Abfrage zu haben :

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

Mit dem entsprechenden execute :

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


Nun, Sie nur muss es jetzt tun:

$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);

Und... Das ist es!

Auf diese Weise wird jeder Parameter separat behandelt, was Sie wollen (Sicherheit, Sicherheit, Sicherheit!) und das alles auf dynamische Weise mit nur einem INSERT Abfrage

Wenn Sie zu viele Zeilen zum Einfügen haben (siehe dies ), sollten Sie execute eins nach dem anderen

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