Mysql
 sql >> база данни >  >> RDS >> Mysql

Вмъкнете няколко реда с подготвени изрази за PDO

Първото важно нещо, което трябва да кажете е, че виможетете вмъкнете няколко реда благодарение само на един INSERT заявка

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

След като разберете това, можете да получите добро решение с PDO (например).
Трябва да имате предвид, че искате пълна prepare и execute процес (по отношение на сигурността трябва да предавате всеки параметър поотделно).

Да приемем, че имате редове за вмъкване, структурирани по следния начин:

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

Вашата цел е да имате този резултат като подготвена заявка :

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

Със съответното йизпълнение :

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


Е, вие само трябва да го направя сега:

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

И... Това е!

По този начин всеки параметър се третира отделно, което е това, което искате (сигурност, сигурност, сигурност!) и всичко това по динамичен начин, само с един INSERT заявка

Ако имате твърде много редове за вмъкване (вижте това ), трябва да execute един по един

$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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да конвертирате UTC дата в местна часова зона в MySql Изберете заявка

  2. Бавна заявка при използване на ORDER BY

  3. PDO:MySQL сървърът е изчезнал

  4. Как да предоставим разрешения за отдалечен достъп до mysql сървър за потребител?

  5. Множество броя с различни условия в една MySQL заявка