2012-12-20 67 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