【发布时间】:2013-01-11 08:20:45
【问题描述】:
我在 PHP/MySQLi 中使用两个准备好的语句从 mysql 数据库中检索数据。但是,当我运行语句时,出现“命令不同步,您现在无法运行命令”错误。
这是我的代码:
$stmt = $mysqli->prepare("SELECT id, username, password, firstname, lastname, salt FROM members WHERE email = ? LIMIT 1";
$stmt->bind_param('s', $loweredEmail);
$stmt->execute();
$stmt->store_result();
$stmt->bind_result($user_id, $username, $db_password, $firstname, $lastname, $salt);
$stmt->fetch();
$stmt->free_result();
$stmt->close();
while($mysqli->more_results()){
$mysqli->next_result();
}
$stmt1 = $mysqli->prepare("SELECT privileges FROM delegations WHERE id = ? LIMIT 1");
//This is where the error is generated
$stmt1->bind_param('s', $user_id);
$stmt1->execute();
$stmt1->store_result();
$stmt1->bind_result($privileges);
$stmt1->fetch();
我尝试过的:
- 将准备好的语句移动到两个单独的对象中。
-
使用代码:
while($mysqli->more_results()){ $mysqli->next_result(); } //To make sure that no stray result data is left in buffer between the first //and second statements - 使用 free_result() 和 mysqli_stmt->close()
PS:“Out of Sync”错误来自第二条语句的“$stmt1->error”
【问题讨论】:
-
+1 一个问得很好的问题。这些天对新用户来说似乎很少见。
-
@BackinaFlash 在写这个问题之前,我实际上看过这个问题。不同之处在于我使用 mysqli_stmt::store_result() 缓冲了我的结果,并在尝试第二条语句之前释放了所有以前的结果
-
如果你有它,你可以用 MYSQLI_ASYNC 试试,看看它会产生什么输出。此外,您可能想尝试在 mysqli 对象上运行 free_result 而不是语句。
-
好的。我解决了这个问题。就我而言,我有一个存储过程,它接受输入和输出变量。由于某种原因,当使用输出变量作为存储过程中的参数时,mysqli 无法释放资源。要解决此问题,只需在过程主体内返回一个记录集,而不是将值存储在输出变量/参数中。例如,代替 SET outputVar = LAST_INSERT_ID();你可以有 SELECT LAST_INSERT_ID();