2013-10-22 8 views
5

Come si inserisce questa query con mysqli? ...MySQLi multipla Inserisci riga, semplice query di inserimento più

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

Normalmente in questa query mysql è dritto in avanti e saranno inserite 3 righe, come faccio a fare questo in mysqli senza usare una dichiarazione preparata o magari usando una dichiarazione preparata ma senza diventare troppo complicata ?. Vorrei solo sapere se c'è un modo per eseguire tale query senza fare cose extra funky in PHP.

In sostanza, ho alcuni dati estratti che hanno circa 10 righe per inserto (e richiede anche più inserti oltre ad avere più righe), e questo è ciò di cui ho bisogno. Vorrei solo farlo con una query, come ho fatto normalmente con mysql, e non aggiungere più inserimenti come uno per ogni riga.

+0

mysqli è solo un insieme di funzioni per inviare la query in mysql. –

+0

Memorizza l'istruzione SQL in una variabile e passa a mysqli_query come parametro; –

+0

Sajuna purtroppo non può essere fatto in questo modo. Mysqli non è lo stesso di mysql. – user1675155

risposta

-3

Mysqli non è un database di proprietà, ma solo un set di funzioni per inviare la query nel vecchio mysql.

Quindi, utilizzando mysqli è possibile eseguire qualsiasi query mysql.

Tuttavia, in caso di valori forniti dinamicamente, non è possibile evitare "cose ​​extra funky in PHP" poiché si suppone che si debbano utilizzare le istruzioni preparate per questo scopo. E, sfortunatamente, mysqli non è così semplice con loro.

Quindi, per effettuare tale inserimento è necessario creare una query con i segnaposto primi

inserire dati nella tabella (campo1, campo2, field3) VALORI (?,?,?), (?,?,?) , (?,?,?);

quindi associare tutti i valori utilizzando call_user_func_array()
e infine execute;

+0

Ok, credo di poterlo fare. l'intera query è stata effettivamente preparata con php, quindi sarebbe una lunga query singola, ma suppongo di doverla modificare per adattarla a mysqli. Non volevo fare cose extra solo per un inserto, ma suppongo che devo adeguarmi a mysqli. Grazie!, Ottima risposta. – user1675155

+0

Non hai risposto alla sua domanda. Come inserisco questa query con mysqli? ... – karmafunk

+0

Trovato una domanda simile: http://stackoverflow.com/questions/15575405/mysqli-and-binding-multiple-value-sets-during-insert ma ancora nessuna soluzione! !!! – user1675155

-4

Non è necessario utilizzare istruzioni preparate se è già stata creata la query SQL.

$result = $mysqli->query($sql_query); 

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

Assicurati di fare attenzione all'iniezione SQL, ma se hai preparato la tua affermazione, presumo che tu l'abbia già fatto.

Per inserto:

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)"; 
$mysqli->query($query); 

printf ("New Record has id %d.\n", $mysqli->insert_id); 
+0

Queste frasi sono reciprocamente esclusive, se non le notate. –

+0

C'è sempre un ego – karmafunk

+1

È un "INSERT" non un select !!!! – user1675155

12

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()). 
+1

Questo è esattamente quello che stavo cercando di EVITARE, come ho detto, volevo solo passare la query, SENZA fare cose extra funky in PHP, ed è un esempio estremo di cose funky, in altre parole, volevo passare la query il più possibile sulla sua forma grezza. – user1675155

+0

@fyo ma come gestiresti con Method1 o Method2, se Data è _not_ memorizzato in un _array_, ma in un oggetto _JSON_? Come tagliare le centinaia o migliaia di set di dati JSON in pezzi da 10 per inserirli contemporaneamente? – Peter

Problemi correlati