sql >> Database teknologi >  >> RDS >> Mysql

Indsæt flere rækker med PDO-forberedte erklæringer

Den første vigtige ting at sige er, at du kan indsæt flere rækker takket være kun én INSERT forespørgsel

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

Når du ved det, er du i stand til at få en god løsning med PDO (for eksempel).
Du skal huske på, at du vil have en komplet prepare og execute proces (med hensyn til sikkerhed skal du videregive hver parameter separat).

Lad os sige, at du har rækker at indsætte struktureret som følger:

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

Dit mål er at få dette resultat som en forberedt forespørgsel :

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

Med dens tilsvarende execute :

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


Nå, kun dig skal gøre det nu:

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

Og... Det var det!

På denne måde behandles hver param separat, hvilket er hvad du ønsker (sikkerhed, sikkerhed, sikkerhed!) og det hele, på en dynamisk måde, med kun én INSERT forespørgsel

Hvis du har for mange rækker at indsætte (se dette ), bør du execute én efter é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. mysql lagret procedure, der kalder sig selv rekursivt

  2. Halloween-problemet – del 1

  3. Sådan formateres datoer i Oracle

  4. MySQL - Hvordan SUMMER man tider?