mysqli:它可以在一个语句中准备多个查询吗?

Posted

技术标签:

【中文标题】mysqli:它可以在一个语句中准备多个查询吗?【英文标题】:mysqli: can it prepare multiple queries in one statement? 【发布时间】:2012-07-22 21:23:28 【问题描述】:

我想知道我是否可以准备一个执行多个查询的 mysqli 语句:

mysqli->prepare(query1 ...1,2,3 param...; query2...4,5 param...);
or 
mysqli->prepare(insert into ...1,2,3 param...; insert into...4,5 param...);
and after all
mysqli->bind_param("sssss", 1, 2, 3, 4, 5);

这样会出错:在...中的非对象上调用成员函数 bind_param()

$stmt = $sql->getQueryPrepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?); INSERT INTO process (id_user, idp) VALUES (?,?);");

$stmt->bind_param("ssssss",$id, $username, $pw, $email, $id, $idp);

$stmt->execute();
$stmt->close(); 

【问题讨论】:

【参考方案1】:

准备好的语句只能执行一个 MySQL 查询。您可以在不同的变量中准备任意数量的语句:

$stmtUser = $sql->prepare("INSERT INTO user (id_user, username, pw, email) VALUES (?,?,?,?)");
$stmtProc = $sql->prepare("INSERT INTO process (id_user, idp) VALUES (?,?);");

然后再执行它们。如果您想确保除非两者都能够运行,否则两者都不会运行,那么您需要研究事务,就像 Thomas 说的那样。

另外,一般提示:“在非对象上调用成员函数”是您在 prepare() 失败时得到的标准错误,因此 $stmt 实际上不是准备好的语句对象。这通常意味着您需要在 prepare() 语句中查找错误,而不是稍后查找任何错误。

【讨论】:

但是多重准备不是原子过程吗? 正确,使用多个准备执行此操作不是原子的。 @octern,这不起作用。实际上,如果您考虑一下,这甚至没有意义,呼叫不能相互交叉,因为它们共享相同的$mysqli 连接。如果你预先准备了两条语句,然后尝试同时执行$stmtUser$stmtProc,那么只有一条会成功,而第二条肯定会失败。您是否实际测试并获得了实际工作代码? 在这里工作正常 @Pacerier 如果你的意思是相交你得到一个错误,然后在执行后关闭语句。我不确定是否会发生多个准备,但是执行一个而不关闭它会在执行一秒钟时导致同步错误。【参考方案2】:

不,一次调用 mysqli prepare() 函数不能同时准备多个查询。但是,您可以使用不同的变量为执行准备多个查询。 The documentation for this function is available here.

您似乎也在尝试设置交易,这与您提出的问题不同。如果这是您真正想知道的,那么您需要提供有关您的数据库设置的更多信息,并可能提供有关您尝试解决的用例的更多细节。

【讨论】:

虽然您可以使用不同的变量为执行准备多个查询,但您不能将它们相交。 It won't work.

以上是关于mysqli:它可以在一个语句中准备多个查询吗?的主要内容,如果未能解决你的问题,请参考以下文章

MySQLi:使用一个准备好的语句插入多行

如何在 mysqli 准备语句中使用多个内部连接和多个 WHERE 子句? [复制]

没有绑定参数的mysqli准备好的语句仍然安全吗?

动态 mysqli 准备语句失败

多个 MySQLi 准备语句和漏洞(评价我的代码)

我可以在 JDBC 准备查询中使用多个语句吗?