【问题标题】:mysqli: can it prepare multiple queries in one statement?mysqli:它可以在一个语句中准备多个查询吗?
【发布时间】:2021-08-10 10:06:35
【问题描述】:

我想知道我是否可以准备一个执行多个查询的 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(); 

【问题讨论】:

    标签: php mysql mysqli prepared-statement


    【解决方案1】:

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

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

    【讨论】:

    • 虽然您可以使用不同的变量为执行准备多个查询,但您不能将它们相交It won't work.
    【解决方案2】:

    准备好的语句只能执行一个 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 如果你的意思是相交你得到一个错误,然后在执行后关闭语句。我不确定是否会发生多个准备,但是执行一个而不关闭它会在执行一秒钟时导致同步错误。
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多