sql >> Databasteknik >  >> RDS >> Mysql

Infoga flera rader med PDO-förberedda uttalanden

Det första viktiga att säga är att du kan infoga flera rader tack vare bara en INSERT fråga

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 väl vet det kan du få en bra lösning med PDO (till exempel).
Du måste komma ihåg att du vill ha en komplett prepare och execute process (av säkerhetssynpunkt måste du skicka varje parameter separat).

Låt oss säga att du har rader att infoga strukturerade enligt följande:

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

Ditt mål är att få detta resultat som en förberedd fråga :

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

Med motsvarande kör :

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


Tja, du bara måste göra 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);

Och... Det var allt!

På detta sätt behandlas varje param separat, vilket är vad du vill ha (säkerhet, säkerhet, säkerhet!) och allt, på ett dynamiskt sätt, med bara en INSERT fråga

Om du har för många rader att infoga (se detta ), bör du execute en efter en

$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. Begränsning av främmande nyckel kan orsaka cykler eller flera kaskadvägar?

  2. Hur man lägger till en kolumn i SQL

  3. Hur kan jag hitta alla tabeller i MySQL med specifika kolumnnamn i dem?

  4. Python-import MySQLdb-fel - Mac 10.6