formulario - insertar datos php y mysql ejemplos
Cómo insertar una matriz en una única declaración preparada de MySQL con PHP y PDO (3)
2 soluciones
// multiple queries
$stmt = $pdo->prepare(''INSERT INTO table SET memberID=:memberID, programID=:programID, date_added=NOW()'');
$data = array(155, 165, 175, 185);
foreach($data as $d) {
$stmt->execute(array('':memberID'' => $memberid, '':programID'' => $d));
}
Y
// one query
$data = array(155, 165, 175, 185);
$values = array();
foreach($data as $d) {
$values[] = sprintf(''(%d, %d, NOW())'', $d, $memberid);
}
$sql = sprintf(''INSERT INTO table (memberID, programID, date_added) VALUES %s'', implode ('', '', $values));
$pdo->exec($sql);
Durante una inscripción en línea, un cliente puede seleccionar una serie de programas para los que elige inscribirse. Estos programas son enteros de tres dígitos y se almacenan en una matriz.
Por ejemplo:
Quiero inscribirme en el programa 155, 165, 175 y 185.
Mi arreglo está configurado tan simple como:
$data = array();
$data[] = 155;
$data[] = 165;
$data[] = 175;
$data[] = 185;
Cuando llega el momento de insertar esta información en la tabla asociada, también incluyo elementos adicionales de la otra parte de la inscripción:
Por ejemplo, si estuviera haciendo una instrucción de inserción de programa SINGLE, se vería de la siguiente manera:
$stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()");
$stmt->execute(array($memberid, 155));
Normalmente, crearía un bucle simple para el conjunto de arriba que llamaría a múltiples instancias de la instrucción SQL y se ejecutaría como:
for($j = 0; $j < (count($data)-1); $j++) {
$stmt = $db->prepare("INSERT INTO table SET memberID=?, programID=?, date_added=NOW()");
$stmt->execute(array($memberid, $data[$j]));
}
Me doy cuenta de que el código anterior no es válido ($ data [$ j]) pero estoy buscando la forma correcta de hacer la llamada.
También me han dicho antes que la construcción de una única declaración dinámica de SQL es en general mejor que las llamadas múltiples como la anterior. Mi primer paso sería algo así como:
$sql = array();
foreach( $data as $row ) {
$sql[] = ''("''.$memberid.''", "''.$row[$j].''", NOW()")'';
}
mysql_real_query(''INSERT INTO table (memberid, programid) VALUES ''.implode('','', $sql));
pero con PDO no estoy muy seguro de cómo funciona esto, especialmente con marcadores de posición (?).
¿Alguna sugerencia?
Lo que está buscando es cómo hacer un inserto BULK, esto está más relacionado con SQL que con PDO.
Solo tiene que hacer exactamente lo mismo que con * _query, compilar su consulta de inserción masiva y su matriz param uno al lado del otro.
$placeholder = array();
$values = "?, ?, ?, ...";
$args = array();
foreach ($arrays as $array) {
$placeholder[] = $value;
$args[] = $array[''col1''];
$args[] = $array[''col2''];
$args[] = $array[''col3''];
...
}
$sql = "INSERT INTO table (col1, col2, ... ) VALUES ("
. implode(''), ('', $placeholder)
. ")";
$stmt = $db->prepare($sql);
$db->execute($sql, $args);
Este es un algoritmo feo pero funcional, creo.
Puedes construir la consulta programáticamente ...:
$sql = ''INSERT INTO table (memberID, programID) VALUES '';
$insertQuery = array();
$insertData = array();
foreach ($data as $row) {
$insertQuery[] = ''(?, ?)'';
$insertData[] = $memberid;
$insertData[] = $row;
}
if (!empty($insertQuery)) {
$sql .= implode('', '', $insertQuery);
$stmt = $db->prepare($sql);
$stmt->execute($insertData);
}