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

Joh*_*ith 24 php mysql

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

$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");
Run Code Online (Sandbox Code Playgroud)

所有查询完成后,如果我执行mysql_close($ db)会更好吗?

Hus*_*sni 31

传递65536mysql_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
");
Run Code Online (Sandbox Code Playgroud)

使用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;
");
Run Code Online (Sandbox Code Playgroud)

另一个例子,下面的代码,第一个语句是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);
");
Run Code Online (Sandbox Code Playgroud)

  • 神的圣洁母亲! (16认同)
  • 如果有人想知道为什么这样做 - 这不是一个技巧,它只是mySQL客户端的未记录(在PHP文档中)功能.在源代码中,您可以轻松找到`#define CLIENT_MULTI_STATEMENTS 65536/*启用/禁用多stmt支持*/`这正是OP想要的. (7认同)
  • 代码可读性; 将CLIENT_MULTI_STATEMENTS作为mysql_connect的第5个参数传递. (4认同)
  • @Husni,你为什么使用像 65536 这样的“幻数”而不是正确的常量名称? (2认同)

Alu*_*tha 5

可以创建sql注入点“ SQL注入小猪支持的查询”。攻击者能够附加多个恶意sql语句。因此请勿将用户输入直接附加到查询中。

安全注意事项

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

PHP文档