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:它可以在一个语句中准备多个查询吗?的主要内容,如果未能解决你的问题,请参考以下文章