mysqli_query mysqli_fetch_row mysqli_fetch_assoc mysqli_fetch_array last_insert_id last ejemplo php mysql database mysqli

php - mysqli_fetch_assoc - mysqli_fetch_row



Encabezado de fila múltiple de Mysqli, consulta simple de inserción múltiple (3)

¿Cómo inserto esta consulta con mysqli? ...

INSERT INTO table (field1, field2, field3) VALUES (''value'', ''value'', ''value''), (''value'', ''value'', ''value''), (''value'', ''value'', ''value'');

Normalmente en mysql esta consulta es directa e insertará 3 filas, ¿cómo hago esto en mysqli sin usar una declaración preparada o tal vez usando una declaración preparada pero sin complicarme demasiado ?. Solo deseo saber si hay una forma de ejecutar dicha consulta sin hacer cosas extra funky en PHP.

En esencia, tengo algunos datos extraídos que tienen alrededor de 10 filas por inserción (y también necesita varias inserciones además de tener varias filas), y esto es para lo que lo necesito. Solo deseo hacer esto con una consulta, como normalmente lo he hecho con mysql, y no agregar varias inserciones como una por cada fila.


La clase mysqli proporciona una serie de formas diferentes de lograr sus insertos, cada uno con sus propios beneficios. Ciertamente, uno de ellos debe ajustarse a tus necesidades.

Los siguientes ejemplos suponen que los "datos extraídos" no especificados se almacenan en una matriz de matrices: $ bigArray [0 ... datasetsize] [0 ... 2].

La base de datos mysqli se supone que es $ db.

Método 1 - Old School

Puede hacerlo de forma directa como está acostumbrado simplemente construyendo su cadena de consulta y consultando la base de datos con ella. Los insertos se incluyen de 10 en 10, como usted especificó. El siguiente código muestra uno de esos paquetes y se amplía trivialmente a todo el conjunto de datos (bigArray). Los datos probablemente deberían ser escapados usando mysqli :: escape_string (no hecho aquí).

Se supone que los datos que se insertarán son enteros en todos los ejemplos.

$sql = "INSERT INTO testTable (fieldA, fieldB, fieldC) VALUES "; for ($i = 0; $i < 10; ++$i) { if ($i > 0) $sql .= ", "; $sql .= "({$bigArray[$i][0]}),({$bigArray[$i][1]}),({$bigArray[$i][2]})"; } $db->query($sql);

Método 2: tan simple como sea posible

Si desea utilizar una declaración preparada y un enlace de parámetros, un primer esfuerzo podría ser similar al siguiente. Aunque no es óptimo, la declaración solo se prepara una vez. Sin embargo, las variables están vinculadas para cada inserción, lo cual es un desperdicio (pero simple). Como las inserciones no están agrupadas, el ejemplo pasa por 10.

$statement = $db->prepare("INSERT INTO testTable (fieldA, fieldB, fieldC) VALUES (?,?,?)"); for ($i = 0; $i < 10; ++$i) { $statement->bind_param("iii",$bigArray[$i][0],$bigArray[$i][1],$bigArray[$i][2]); $statement->execute(); }

Método 3 - Optimizado

Las declaraciones preparadas y los insertos múltiples combinados permiten un rendimiento que es casi idéntico a las consultas de inserción sin formato del Método 1. Los resultados reales variarán según su configuración, pero una prueba rápida en mi sistema con una base de datos local y remota mostró un rendimiento de algunos porcentajes apunte más rápido con el método optimizado, aumentando unos pocos puntos más si se deben escapar los datos del Método 1.

Lo siguiente usa call_user_func_array, pero puede evitar eso si sabe cuántas inserciones desea agrupar cada vez y compilar directamente bind_param. Eso aumentaría aún más el rendimiento ligeramente.

Para mayor claridad, este ejemplo incluye el bucle externo y asume 10k líneas totales para ser insertadas (es decir, bigArray [0.9999] [0..2]).

$sql = "INSERT INTO testTable (fieldA,fieldB,fieldC) VALUES (?,?,?)".str_repeat(",(?,?,?)",9); $statement = $db->prepare($sql); // This is the type string used by statement::bind_param. // Example assumes all INTs. $types = (array)str_repeat("i",30); $values = array_fill(0,30,0); // A bit of unneeded variable init. // * See notes following code snippet on why the intermediate array is used. $intermediate = array(); for ($n = 0; $n < 30; ++$n) { $intermediate[$n] = &$values[$n]; } call_user_func_array(array(&$statement, "bind_param"), array_merge($types,$f)); for ($j = 0; $j < 1000; ++$j) { for ($i = 0; $i < 10; ++$i) { $values[$i*3] = $bigArray[$i][0]; $values[$i*3+1] = $bigArray[$i][1]; $values[$i*3+2] = $bigArray[$i][2]; } $statement->execute(); } // call_user_func_array with bind_param requires the values be // passed by reference which is evaluated only on the initial // call. Using $values[...] = &$bigArray[...] below won''t work // and an intermediate array referencing $values is used. This // bit of "extra funky stuff" can be avoided at a very slight // performance penalty by setting $values[...] = $bigArray[...] // AND EVALUATING EACH TIME (move call_user_func_array // inside the outer loop, i.e. right above $statement->execute()).


Mysqli no es una base de datos propia, sino simplemente un conjunto de funciones para enviar su consulta en mysql antiguo.

Entonces, usando mysqli puedes ejecutar cualquier consulta mysql.

Sin embargo, en el caso de los valores proporcionados dinámicamente, no puede evitar "cosas funky extra en PHP", ya que se supone que debe usar declaraciones preparadas para eso. Y, desafortunadamente, raw mysqli no es tan fácil con ellos.

Por lo tanto, para realizar dicha inserción, primero deberá crear una consulta con marcadores de posición

INSERT INTO table (campo1, campo2, campo3) VALUES (?,?,?), (?,?,?), (?,?,?);

luego unir todos los valores usando call_user_func_array()
y finalmente execute ;


No necesita usar declaraciones preparadas si ya ha creado su consulta SQL.

$result = $mysqli->query($sql_query); while( $row = $result->fetch_array(MYSQLI_ASSOC) ) { $rows[]=$row; }

Asegúrese de estar atento a la inyección SQL, pero si ha preparado su declaración, supongo que ya lo hizo.

Para insertar:

$query = "INSERT INTO myCity VALUES (NULL, ''Stuttgart'', ''DEU'', ''Stuttgart'', 617000)"; $mysqli->query($query); printf ("New Record has id %d./n", $mysqli->insert_id);