sql >> Base de Datos >  >> RDS >> Mysql

Inserte varias filas con declaraciones preparadas de PDO

Lo primero que hay que decir es que puedes insertar múltiples filas gracias a solo one INSERT consulta

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

Una vez que sepa eso, podrá obtener una buena solución con PDO (por ejemplo).
Debe tener en cuenta que desea una prepare completa y execute proceso (en términos de seguridad, debe pasar cada parámetro por separado).

Digamos que tiene filas para insertar estructuradas de la siguiente manera:

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

Su objetivo es tener este resultado como una consulta preparada :

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

Con su correspondiente ejecutar :

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


Bueno, solo tengo que hacerlo ahora:

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

Y... ¡Eso es todo!

De esta forma, se trata cada parámetro por separado, que es lo que tú quieres (¡seguridad, seguridad, seguridad!) y todo ello, de forma dinámica, con un solo INSERT consulta

Si tiene demasiadas filas para insertar (consulte esto ), debe execute uno por uno

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