我在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();
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
使用代码:
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
Run Code Online (Sandbox Code Playgroud)PS:'Out of Sync'错误来自第二个语句的'$ stmt1->错误'
小智 16
在mysqli :: query中如果你使用MYSQLI_USE_RESULT,所有后续调用将返回错误命令不同步,除非你调用mysqli_free_result()
调用多个存储过程时,可能会遇到以下错误:"命令不同步;您现在无法运行此命令".即使在调用之间对结果对象使用close()函数,也会发生这种情况.要解决此问题,请记住在每次存储过程调用后调用mysqli对象上的next_result()函数.见下面的例子:
<?php
// New Connection
$db = new mysqli('localhost','user','pass','database');
// Check for errors
if(mysqli_connect_errno()){
echo mysqli_connect_error();
}
// 1st Query
$result = $db->query("call getUsers()");
if($result){
// Cycle through results
while ($row = $result->fetch_object()){
$user_arr[] = $row;
}
// Free result set
$result->close();
$db->next_result();
}
// 2nd Query
$result = $db->query("call getGroups()");
if($result){
// Cycle through results
while ($row = $result->fetch_object()){
$group_arr[] = $row;
}
// Free result set
$result->close();
$db->next_result();
}
else echo($db->error);
// Close connection
$db->close();
?>
Run Code Online (Sandbox Code Playgroud)
我希望这个能帮上忙
小智 6
"命令不同步;您现在无法运行此命令"
有关此错误的详细信息可以在mysql文档中找到.阅读这些细节清楚地表明,在同一连接上执行另一个预准备语句之前,需要完全获取预准备语句执行的结果集.
可以通过使用存储结果调用来解决问题.这是我最初尝试做的一个例子:
<?php
$db_connection = new mysqli('127.0.0.1', 'user', '', 'test');
$post_stmt = $db_connection->prepare("select id, title from post where id = 1000");
$comment_stmt = $db_connection->prepare("select user_id from comment where post_id = ?");
if ($post_stmt->execute())
{
$post_stmt->bind_result($post_id, $post_title);
if ($post_stmt->fetch())
{
$comments = array();
$comment_stmt->bind_param('i', $post_id);
if ($comment_stmt->execute())
{
$comment_stmt->bind_result($user_id);
while ($comment_stmt->fetch())
{
array_push($comments, array('user_id' => $user_id));
}
}
else
{
printf("Comment statement error: %s\n", $comment_stmt->error);
}
}
}
else
{
printf("Post statement error: %s\n", $post_stmt->error);
}
$post_stmt->close();
$comment_stmt->close();
$db_connection->close();
printf("ID: %d -> %s\n", $post_id, $post_title);
print_r($comments);
?>
Run Code Online (Sandbox Code Playgroud)
以上将导致以下错误:
注释语句错误:命令不同步; 你现在不能运行这个命令
PHP注意:未定义的变量:第41行的错误.php中的post_title ID:9033 - > Array()
以下是使其正常工作所需要做的事情:
<?php
$db_connection = new mysqli('127.0.0.1', 'user', '', 'test');
$post_stmt = $db_connection->prepare("select id, title from post where id = 1000");
$comment_stmt = $db_connection->prepare("select user_id from comment where post_id = ?");
if ($post_stmt->execute())
{
$post_stmt->store_result();
$post_stmt->bind_result($post_id, $post_title);
if ($post_stmt->fetch())
{
$comments = array();
$comment_stmt->bind_param('i', $post_id);
if ($comment_stmt->execute())
{
$comment_stmt->bind_result($user_id);
while ($comment_stmt->fetch())
{
array_push($comments, array('user_id' => $user_id));
}
}
else
{
printf("Comment statement error: %s\n", $comment_stmt->error);
}
}
$post_stmt->free_result();
}
else
{
printf("Post statement error: %s\n", $post_stmt->error);
}
$post_stmt->close();
$comment_stmt->close();
$db_connection->close();
printf("ID: %d -> %s\n", $post_id, $post_title);
print_r($comments);
?>
Run Code Online (Sandbox Code Playgroud)
有关上述示例的几点注意事项:
The bind and fetch on the statement still works correctly.
Make sure the results are freed when the processing is done.
Run Code Online (Sandbox Code Playgroud)
对于那些做正确的事情并使用带有预准备语句的存储过程的人来说。
由于某种原因,当使用输出变量作为存储过程中的参数时,mysqli 无法释放资源。要解决此问题,只需在过程主体中返回记录集,而不是将值存储在输出变量/参数中。
例如,不要使用 SET outputVar = LAST_INSERT_ID(); 你可以有 SELECT LAST_INSERT_ID(); 然后在 PHP 中我得到这样的返回值:
$query= "CALL mysp_Insert_SomeData(?,?)";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("is", $input_param_1, $input_param_2);
$stmt->execute() or trigger_error($mysqli->error); // trigger_error here is just for troubleshooting, remove when productionizing the code
$stmt->store_result();
$stmt->bind_result($output_value);
$stmt->fetch();
$stmt->free_result();
$stmt->close();
$mysqli->next_result();
echo $output_value;
Run Code Online (Sandbox Code Playgroud)
现在您已准备好执行第二个存储过程,而不会出现“命令不同步,您现在无法运行命令”错误。如果您在记录集中返回多个值,您可以循环遍历并获取所有这些值,如下所示:
while ($stmt->fetch()) {
echo $output_value;
}
Run Code Online (Sandbox Code Playgroud)
如果您从存储过程中返回多个记录集(您有多个选择),请确保使用 $stmt->next_result(); 遍历所有这些记录集;