2012-12-20 65 views
20

如何加入這些多個查詢到一個(可以嗎?)執行多個SQL查詢在一個聲明中使用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"); 

順便說豈不是更好,如果我做mysql_close($分貝)之後的所有查詢做了什麼?

+1

讓一個'$ query',只是確保你添加一個','每行之後。 – Pitchinnate

+1

爲什麼你需要這個?大多數情況下,可讀性比效率低很重要。 – Muatik

+3

請不要在新的應用程序中使用'mysql_query'。它已被棄用和危險。至少在使用PDO確保[數據正確轉義](http://bobby-tables.com/php)之前,由於SQL注入漏洞而導致嚴重麻煩。 – tadman

回答

25

通過65536mysql_connect作爲第五參數。

例子:

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

當你與mysql_fetch_ *或mysql_num_rows,或mysql_affected_rows工作,只有第一條語句是有效的。

例如,下面的代碼中,第一條語句是INSERT,不能執行mysql_num_rows和mysql_fetch_ *。 可以使用mysql_affected_rows返回插入的行數。

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

另一個例子,下面的代碼,第一條語句是SELECT,你不能執行mysql_affected_rows。但是您可以執行mysql_fetch_assoc來獲取第一個SELECT語句產生的鍵值對行,或者您可以執行mysql_num_rows以基於第一個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

神的聖母! –

+6

如果有人想知道爲什麼這會起作用 - 這不是一個技巧,它只是沒有文檔(在PH​​P文檔中)mySQL客戶端的功能。在源代碼中你可以很容易找到#define CLIENT_MULTI_STATEMENTS 65536/*啓用/ stmt support * /'這正是OP想要的 –

+3

代碼可讀性;將CLIENT_MULTI_STATEMENTS作爲mysql_connect的第5個參數傳遞 –

0

您可以添加單詞JOIN或添加一個;每行之後(如@pictchubbate所說)。這樣做更好,因爲可讀性,也不應該插入DELETE和INSERT;南方很容易。

最後一個問題是辯論的問題,但據我所知,你應該在一系列查詢後關閉。這主要適用於舊的普通mysql/php,而不是PDO,mysqli。在這些情況下事情變得更加複雜(並且在辯論中引起激烈爭論)。

最後,我會建議使用PDO或其他方法。

4

這可能會創建SQL注入點「SQL注入豬背景查詢」。攻擊者能夠追加多個惡意的sql語句。所以不要將用戶輸入直接附加到查詢中。

安全考慮

的API函數mysqli_query()和mysqli_real_query()不設置必需的服務器激活多查詢連接標誌。一個額外的API調用用於多個語句,以減少意外SQL注入攻擊的可能性。攻擊者可能會嘗試添加以下語句: DROP DATABASE mysql或; SELECT SLEEP(999)。如果攻擊者成功向語句字符串添加SQL,但未使用mysqli_multi_query,則服務器將不執行第二個注入和惡意SQL語句。

PHP Doc