2012-12-20 13 views
20

Jak dołączyć do tych wielu zapytań do jednego (mogę?)Wykonywanie wielu zapytań SQL w jednej instrukcji 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"); 

Nawiasem mówiąc jest to lepiej jeśli robię mysql_close ($ db) po wszystkich zapytań Gotowe?

+1

Dodać jeden '$ query' i po prostu upewnij się dodać'; 'po każdym wierszu. – Pitchinnate

+1

Dlaczego tego potrzebujesz? Większość czasu czytelność jest ważniejsza niż niewielkie usprawnienia. – Muatik

+3

Proszę nie używać 'mysql_query' w nowych aplikacjach. Jest przestarzały i niebezpieczny. Przynajmniej używaj PDO, aby upewnić się, że twoje dane są właściwie usunięte (http://bobby-tables.com/php), zanim skończy się to poważnymi problemami z powodu błędu SQL injection. – tadman

Odpowiedz

25

Przekazać 65536 do mysql_connect jako piąty parametr.

Przykład:

$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 
"); 

Podczas pracy z mysql_fetch_ * lub mysql_num_rows lub mysql_affected_rows tylko pierwsze zdanie jest ważne.

Na przykład następujące kody, pierwsza instrukcja to INSERT, nie można wykonać mysql_num_rows i mysql_fetch_ *. Jest w porządku, aby użyć mysql_affected_rows do zwrócenia liczby wstawionych wierszy.

$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; 
"); 

Inny przykład, następujące kody, pierwsze stwierdzenie jest SELECT, nie można wykonać mysql_affected_rows. Ale możesz wykonać mysql_fetch_assoc, aby uzyskać parę wierszy klucz-wartość z pierwszej instrukcji SELECT lub możesz wykonać mysql_num_rows, aby uzyskać liczbę wierszy na podstawie pierwszej instrukcji 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

Święta Matka Boża! –

+6

Jeśli ktoś się zastanawia, dlaczego to działa - to nie jest sztuczka, to po prostu nieudokumentowana (w PHP docs) funkcja klienta mySQL.W źródłach można łatwo znaleźć '#define CLIENT_MULTI_STATEMENTS 65536/* Włącz/wyłącz wiele wsparcie stmt */'dokładnie to, co chciał OP. –

+3

Dla czytelności kodu, Pass CLIENT_MULTI_STATEMENTS jako 5-ty parametr mysql_connect –

0

Wystarczy dodać słowo JOIN lub dodaj; po każdym wierszu (jak powiedział @pictchubbate). Lepiej w ten sposób ze względu na czytelność, a także nie powinieneś mieszać się DELETE z INSERT; łatwo jest iść na południe.

Ostatnie pytanie jest przedmiotem dyskusji, ale o ile wiem, tak, należy zamknąć po zestawie zapytań. Dotyczy to głównie starego zwykłego mysql/php, a nie PDO, mysqli. W tych przypadkach sprawy stają się bardziej skomplikowane (i rozgrzane w debatach).

Na koniec sugerowałbym użycie PDO lub innej metody.

4

To może być utworzony punkt wstrzykiwania sql "Zapytania SQL z prośbą o pomoc". napastnicy mogący dołączyć wiele złośliwych instrukcji sql. więc nie dołączaj danych użytkownika bezpośrednio do zapytań.

względy bezpieczeństwa

mysqli_query funkcje API() i mysqli_real_query() nie ustawić flagę połączenia niezbędne do aktywacji obsługujący kilka zapytań na serwerze. Dodatkowe wywołanie API jest używane dla wielu instrukcji, aby zmniejszyć prawdopodobieństwo przypadkowych ataków typu SQL injection. Osoba atakująca może próbować dodawać takie instrukcje, jak; DROP DATABASE mysql lub; SELECT SLEEP (999). Jeśli atakujący z powodzeniem dodaje SQL do ciągu instrukcji, ale mysqli_multi_query nie jest używany, serwer nie wykona drugiej, wstrzykniętej i złośliwej instrukcji SQL.

PHP Doc

Powiązane problemy