[英]Executing multiple SQL queries in one statement with 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($ db)会更好吗?
将65536
传递给mysql_connect
作为第5个参数。
例:
$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);
");
这可能是创建sql注入点“SQL Injection Piggy-backed Queries”。 攻击者能够附加多个恶意sql语句。 所以不要直接将用户输入附加到查询。
安全考虑
API函数mysqli_query()和mysqli_real_query()不设置激活服务器中多个查询所需的连接标志。 额外的API调用用于多个语句,以减少意外SQL注入攻击的可能性。 攻击者可能会尝试添加诸如的语句; DROP DATABASE mysql或; 选择休眠(999)。 如果攻击者成功将SQL添加到语句字符串但未使用mysqli_multi_query,则服务器将不会执行第二个注入的恶意SQL语句。
使用mysqli
您可以使用mysqli_multi_query()
实际使用多个语句。
你可以添加单词JOIN或添加一个; 在每一行之后(如@pictchubbate所说)。 由于可读性,这种方式更好,你也不应该用INSERT插入DELETE; 南方很容易。
最后一个问题是一个有争议的问题,但据我所知,你应该在一系列查询之后关闭。 这主要适用于旧的普通mysql / php而不是PDO,mysqli。 在这些情况下,事情变得更加复杂(并在辩论中激烈)。
最后,我建议使用PDO或其他方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.