sql >> Database >  >> RDS >> Mysql

Voeg meerdere rijen in met PDO voorbereide verklaringen

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


  1. Over de impact van paginagrote schrijfacties

  2. Een technische vergelijking:Microsoft Access 2016 versus SQL Server 2016

  3. MySQL:Hoe kan ik meerdere keren deelnemen aan dezelfde tafel?

  4. Relationele versus niet-relationele databases - Deel 3