2012-12-20 24 views
20

Come aderire quelle più query in un unico (posso?)Esecuzione più query SQL in una dichiarazione con PHP

$query = "DELETE FROM aktywne_kody WHERE kodsms ='$kodSMSgracza' AND typkodu ='$id'"; 
mysql_query($query) or die(mysql_error()); 

$query = "INSERT INTO uzyte_kody (gracz, kodsms, typkodu) VALUES ('$nickGracza', '$kodSMSgracza', '$id')"; 
mysql_query($query) or die("Błąd MySQL X04"); 

$query = "INSERT INTO do_odebrania (gracz, itemDATA, itemQTY) VALUES ('$nickGracza', '$itemDATA', '$itemQTY')"; 
mysql_query($query) or die("Błąd MySQL X05"); 

Tra l'altro è meglio se faccio mysql_close ($ db) dopo che tutte le query sono fatto?

+1

fare un '$ query' e solo assicurarsi di aggiungere un'; 'dopo ogni riga. – Pitchinnate

+1

Perché ne hai bisogno? La maggior parte delle volte la leggibilità è più importante delle piccole efficienze. – Muatik

+3

Si prega di non utilizzare 'mysql_query' nelle nuove applicazioni. È deprecato e pericoloso. Per lo meno usa PDO per assicurarti che [i dati vengano salvati correttamente] (http://bobby-tables.com/php) prima di finire in gravi problemi a causa di un bug di SQL injection. – tadman

risposta

25

Passaggio 65536 a mysql_connect come 5 ° parametro.

Esempio:

$conn = mysql_connect('localhost','username','password', true, 65536 /* here! */) 
    or die("cannot connect"); 
mysql_select_db('database_name') or die("cannot use database"); 
mysql_query(" 
    INSERT INTO table1 (field1,field2) VALUES(1,2); 

    INSERT INTO table2 (field3,field4,field5) VALUES(3,4,5); 

    DELETE FROM table3 WHERE field6 = 6; 

    UPDATE table4 SET field7 = 7 WHERE field8 = 8; 

    INSERT INTO table5 
     SELECT t6.field11, t6.field12, t7.field13 
     FROM table6 t6 
     INNER JOIN table7 t7 ON t7.field9 = t6.field10; 

    -- etc 
"); 

Quando si lavora con mysql_fetch_ * o mysql_num_rows, o mysql_affected_rows, solo la prima affermazione è valida.

Ad esempio, i seguenti codici, la prima istruzione è INSERT, non è possibile eseguire mysql_num_rows e mysql_fetch_ *. Va bene usare mysql_affected_rows per restituire quante righe sono state inserite.

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect"); 
mysql_select_db('database_name') or die("cannot use database"); 
mysql_query(" 
    INSERT INTO table1 (field1,field2) VALUES(1,2); 
    SELECT * FROM table2; 
"); 

Un altro esempio, i seguenti codici, la prima affermazione è SELECT, non è possibile eseguire mysql_affected_rows. Ma è possibile eseguire mysql_fetch_assoc per ottenere una coppia di valori-chiave di riga risultante dalla prima istruzione SELECT, oppure è possibile eseguire mysql_num_rows per ottenere il numero di righe in base alla prima istruzione SELECT.

$conn = mysql_connect('localhost','username','password', true, 65536) or die("cannot connect"); 
mysql_select_db('database_name') or die("cannot use database"); 
mysql_query(" 
    SELECT * FROM table2; 
    INSERT INTO table1 (field1,field2) VALUES(1,2); 
"); 
+13

Holy Mother of God! –

+6

Se qualcuno si chiede perché funzioni, non è un trucco è una funzionalità non documentata (in PHP docs) del client mySQL. Nelle fonti si può facilmente trovare '#define CLIENT_MULTI_STATEMENTS 65536/* Abilita/disabilita multi- stmt support */'che è esattamente ciò che OP desiderava. –

+3

Per la leggibilità del codice Passa CLIENT_MULTI_STATEMENTS come parametro 5th di mysql_connect. –

0

È possibile aggiungere semplicemente la parola JOIN o aggiungere a; dopo ogni riga (come ha detto @pictchubbate). Migliore in questo modo a causa della leggibilità e inoltre non dovresti immischiare DELETE con INSERT; è facile andare a sud.

L'ultima domanda è una questione di dibattito, ma per quanto ne so si dovrebbe chiudere dopo una serie di domande. Questo vale soprattutto per i vecchi vecchi mysql/php e non per i PDO, mysqli. Le cose si complicano (e si riscaldano nei dibattiti) in questi casi.

Infine, suggerirei di utilizzare PDO o qualche altro metodo.

4

È possibile che venga creato il punto di iniezione sql "Query SQL Pigmentato". aggressori in grado di aggiungere più istruzioni SQL malevoli. quindi non aggiungere gli input dell'utente direttamente alle query.

Considerazioni sulla sicurezza

le funzioni API mysqli_query() e mysqli_real_query() non impostare una bandiera connessione necessaria per attivare le query multiple nel server. Una chiamata API aggiuntiva viene utilizzata per più istruzioni per ridurre la probabilità di attacchi accidentali di SQL injection. Un utente malintenzionato può provare ad aggiungere dichiarazioni come; DROP DATABASE mysql o; SELEZIONA SLEEP (999). Se l'autore dell'attacco riesce ad aggiungere SQL alla stringa dell'istruzione ma mysqli_multi_query non viene utilizzato, il server non eseguirà la seconda istruzione SQL, iniettata e malevola.

PHP Doc

Problemi correlati