22

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

2 回答 2

30

一条预处理语句只能执行一个 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()而不是稍后查找任何错误。

于 2012-07-24T16:55:22.833 回答
17

不,对 mysqliprepare()函数的一次调用不能一次准备多个查询。但是,您可以使用不同的变量为执行准备多个查询。此功能的文档可在此处获得。

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

于 2012-07-24T16:15:04.843 回答