sql >> Databáze >  >> RDS >> Mysql

Vložte více řádků s připravenými výkazy CHOP

První důležitou věcí je říci, že můžete vložit více řádků pouze díky jednomu INSERT dotaz

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

Jakmile to budete vědět, můžete získat dobré řešení (například s PDO).
Musíte mít na paměti, že chcete kompletní prepare a execute procesu (z hlediska bezpečnosti musíte předat každý parametr zvlášť).

Řekněme, že máte řádky ke vložení strukturované následovně:

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

Vaším cílem je mít tento výsledek jako připravený dotaz :

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

S odpovídajícím spustit :

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


No, jen ty musím to udělat hned:

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

A... To je ono!

Tímto způsobem je každý parametr zpracován samostatně, což je to, co chcete (zabezpečení, zabezpečení, zabezpečení!) a to vše dynamickým způsobem, pouze s jedním INSERT dotaz

Pokud máte k vložení příliš mnoho řádků (viz toto ), měli byste execute jeden po druhém

$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 #1093 - V klauzuli FROM nemůžete určit cílovou tabulku 'dárky' pro aktualizaci

  2. Jak dotazovat sloupec CLOB v Oracle

  3. INSERT INTO vs. SELECT INTO

  4. Nejlepší způsob, jak zkontrolovat prázdnou nebo nulovou hodnotu