用PHP在一个语句中执行多个SQL查询
如何将这些多个查询合并为一个(我可以吗?)
$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($ db)所有查询完成后更好吗?
作为第五个parameter passing65536
到mysql_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); ");
这可能会创buildSQL注入点“SQL注入猪背景查询”。 攻击者能够追加多个恶意的sql语句。 所以不要将用户input直接附加到查询中。
安全考虑
API函数mysqli_query()和mysqli_real_query()不会设置在服务器中激活多查询所需的连接标志。 一个额外的API调用用于多个语句,以减less意外的SQL注入攻击的可能性。 攻击者可能会尝试添加以下语句: DROP DATABASE mysql或; select睡眠(999)。 如果攻击者成功向语句string中添加SQL,但未使用mysqli_multi_query,则服务器将不执行第二个注入和恶意SQL语句。
PHP文档
您可以添加单词JOIN或添加一个; 每行之后(如@pictchubbate所说)。 这样做更好,因为可读性,也不应该插入DELETE和INSERT; 往南走很容易。
最后一个问题是辩论的问题,但据我所知,你应该在一系列疑问后closures。 这主要适用于旧的普通的mysql / php而不是PDO,mysqli。 在这些情况下事情变得更加复杂(并且在争论中激烈)。
最后,我会build议使用PDO或其他方法。
使用mysqli
你可以使用mysqli_multi_query()
来使用多个语句。
阅读更多关于PHP文档中的多个语句 。