使用 PHP 在一个语句中执行多个 SQL 查询

2022-08-30 15:42:01

如何将这些多个查询合并为一个(我可以吗?

$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)会更好吗?


答案 1

作为第 5 个参数传递给 。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);
");

答案 2

这可以创建sql注入点“SQL注入携带支持的查询”。能够附加多个恶意 sql 语句的攻击者。因此,不要将用户输入直接追加到查询中。

安全注意事项

API 函数mysqli_query() 和 mysqli_real_query() 不设置在服务器中激活多个查询所需的连接标志。对多个语句使用额外的 API 调用,以减少意外 SQL 注入攻击的可能性。攻击者可能会尝试添加诸如 ;删除数据库 mysql 或 ;选择睡眠(999)。如果攻击者成功将 SQL 添加到语句字符串中,但未使用mysqli_multi_query,则服务器将不会执行第二个注入的恶意 SQL 语句。

PHP 文档


推荐