La classe mysqli offre un certo numero di modi diversi di realizzare i vostri inserti, ciascuno con i propri vantaggi. Certamente, uno di loro dovrebbe adattarsi alle tue esigenze.
I seguenti esempi presuppongono che i "dati estratti" non specificati siano memorizzati in una matrice di matrici: $ bigArray [0 ... datasetsize] [0 ... 2].
Si presuppone che il database mysqli sia $ db.
Metodo 1 - Old School
Si può fare dritto in avanti come si è abituati a semplicemente costruire la vostra stringa di query e interrogare il database con esso. Gli inserti sono in bundle 10 alla volta, come specificato. Il codice seguente mostra uno di questi bundle ed è banalmente esteso all'intero set di dati (bigArray). I dati dovrebbero probabilmente essere sfuggiti usando mysqli :: escape_string (non fatto qui).
Si presuppone che i dati da inserire siano interi in tutti gli esempi.
$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);
Metodo 2 - il più semplice possibile
Se si desidera utilizzare una dichiarazione preparata e vincolante dei parametri, un primo sforzo potrebbe essere simile alla seguente. Sebbene non sia ottimale, la dichiarazione viene preparata solo una volta. Tuttavia, le variabili sono vincolate per ogni inserto, che è uno spreco (ma semplice). Poiché gli inserti non sono distribuiti, l'esempio scorre oltre 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();
}
Metodo 3 - ottimizzata
dichiarazioni preparate e inserti multipli combinati consentire prestazioni che è quasi identica alle interrogazioni inserto prime di Metodo 1. I risultati effettivi variano a seconda della configurazione, ma un test rapido sul mio sistema con database locale e remoto ha mostrato prestazioni di alcuni punti percentuali più veloci con il metodo ottimizzato, aumentando di alcuni punti in più se i dati nel Metodo 1 devono essere sfuggito
I seguenti utilizzi call_user_func_array, ma è possibile evitare ciò se si conosce quanti inserti si desidera raggruppare ogni volta e creare direttamente bind_param di chiamata. Ciò aumenterebbe ulteriormente le prestazioni.
Per chiarezza, questo esempio include il ciclo esterno e presuppone l'inserimento di 10 k linee totali (ad esempio 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 è solo un insieme di funzioni per inviare la query in mysql. –
Memorizza l'istruzione SQL in una variabile e passa a mysqli_query come parametro; –
Sajuna purtroppo non può essere fatto in questo modo. Mysqli non è lo stesso di mysql. – user1675155