命令不同步; 现在无法运行此命令

我正在尝试执行我的 PHP 代码,它通过 mysqli 调用两个 MySQL 查询,并得到错误“ Command out of sync; you can’t run this command now”。

这是我正在使用的代码

<?php
$con = mysqli_connect("localhost", "user", "password", "db");
if (!$con) {
echo "Can't connect to MySQL Server. Errorcode: %s\n". Mysqli_connect_error();
exit;
}
$con->query("SET NAMES 'utf8'");
$brand ="o";
$countQuery = "SELECT ARTICLE_NO FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE % ? %";
if ($numRecords = $con->prepare($countQuery)) {
$numRecords->bind_param("s", $brand);
$numRecords->execute();
$data = $con->query($countQuery) or die(print_r($con->error));
$rowcount = $data->num_rows;
$rows = getRowsByArticleSearch("test", "Auctions", " ");
$last = ceil($rowcount/$page_rows);
}  else {


print_r($con->error);
}
foreach ($rows as $row) {
$pk = $row['ARTICLE_NO'];
echo '<tr>' . "\n";
echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
echo '<td><a href="#" onclick="updateByPk(\'Layer2\', \'' . $pk . '\')">'.$row['shortDate'].'</a></td>' . "\n";
echo '<td><a href="#" onclick="deleterec(\'Layer2\', \'' . $pk . '\')">DELETE RECORD</a></td>' . "\n";
echo '</tr>' . "\n";
}
function getRowsByArticleSearch($searchString, $table, $max) {
$con = mysqli_connect("localhost", "user", "password", "db");
$recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM AUCTIONS WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
if ($getRecords = $con->prepare($recordsQuery)) {
$getRecords->bind_param("s", $searchString);
$getRecords->execute();
$getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
while ($getRecords->fetch()) {
$result = $con->query($recordsQuery);
$rows = array();
while($row = $result->fetch_assoc()) {
$rows[] = $row;
}
return $rows;
}
}
}

我已经尝试阅读这方面的资料,但是我不知道该怎么办。我已经阅读了商店的结果和免费的结果,但这些都没有什么区别时,使用它们。我不确定这个错误究竟是在什么时候造成的,我想知道为什么会造成这个错误,以及如何解决这个问题。

根据我的 debug 语句,甚至没有输入 CountQuery 的第一个 if 循环,这是因为我的 sql 语法在 '% ? %'附近出现了错误。但是,如果我只选择 *,而不是试图基于一个 LIKE 子句进行限制,我仍然会得到不同步的命令错误。

256241 次浏览

I think the problem is that you're making a new connection in the function, and then not closing it at the end. Why don't you try passing in the existing connection and re-using it?

另一种可能性是,您在 while 循环获取的过程中返回。你从来没有完成那个外接。

不能同时进行两个查询,因为 mysqli 默认使用非缓冲查询(对于准备好的语句; 对于普通的 mysql_query则相反)。您可以将第一个提取到一个数组中并循环通过该数组,或者告诉 mysqli 对查询进行缓冲(使用 $stmt->store_result())。

详情请参阅 给你

问题在于 MySQL 客户机 C 库,大多数 MySQL API 都是基于该库构建的。问题在于 C 库不支持查询的同时执行,所以在此基础上构建的所有 API 也不支持。即使使用未缓冲的查询。这是编写异步 MySQLAPI 的原因之一。它使用 TCP 与 MySQL 服务器直接通信,并且有线协议 是的支持同时查询。

您的解决方案是要么修改算法,这样您就不需要同时进行两个操作,要么将它们更改为使用缓冲查询,这可能是它们在 C 库中存在的原始原因之一(另一个原因是提供一种游标)。

我在 C 语言应用程序中解决了这个问题——我是这样做的:

  1. 引自 mysql 论坛:

    在应用程序中使用分号分隔符终止查询时,将产生此错误。在命令行或查询浏览器中执行查询时,需要使用分号分隔符终止查询,但请从应用程序内的查询中删除分隔符。

  2. After running my query and dealing with the results [C API: mysql_store_result()], I iterate over any further potentially pending results that occurs via multiple SQL statement execution such as two or more select statements (back to back without dealing with the results).

    事实上,我的过程不会返回多个结果,但是数据库直到我执行: [ C API: mysql_next_result()]才知道这一点。我在循环中执行此操作,直到它返回非零值。这时当前连接处理程序知道可以执行另一个查询(我缓存我的处理程序以最小化连接开销)。

    这是我使用的循环:

    for(; mysql_next_result(mysql_handler) == 0;)
    /* do nothing */;
    

I don't know PHP but I'm sure it has something similar.

我用 CodeIgniter。 一个服务器好吧... 这个可能更旧..。 不管怎么说

$this->db->reconnect();

修好了。

要解决这个问题,你必须先存储结果数据,然后再使用它

$numRecords->execute();


$numRecords->store_result();

that's all

我今天遇到了同样的问题,但只是在使用存储过程时。这使得该查询的行为类似于多个查询,因此您需要在进行另一个查询之前“使用”其他可用的结果。

while($this->mysql->more_results()){
$this->mysql->next_result();
$this->mysql->use_result();
}

Check to see if you are typing all the parameters correctly. It throws the same error if the amount of parameters defined and then passed to the function are different.

这和最初的问题没有关系,但是我有相同的错误信息,这个帖子是谷歌的第一个点击,我花了一段时间才弄清楚问题是什么,所以它可能对其他人有用:

我没有使用 mysqli,仍然在使用 mysql _ connect 我有一些简单的查询,但一个查询导致所有其他查询在同一个连接中失败。

I use mysql 5.7 and php 5.6 我有一个数据类型为“ JSON”的表。显然,我的 php 版本不能识别 mysql 的返回值(php 只是不知道如何处理 JSON-Format,因为内置的 mysql-module 太旧了(至少我是这么认为的))

现在我将 JSON-Field-Type 改为 Text (现在我不需要原生 mysql JSON 功能) ,一切正常

I call this function every time before using $mysqli->query, and it works with stored procedures as well.

function clearStoredResults(){
global $mysqli;
    

do {
if ($res = $mysqli->store_result()) {
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
    

}

清除引用内存,并运行下一个 MYSQL 提取操作

如果使用 BufferedUnbuffered结果集来获取数据,则使用 首先,在获取了所有数据之后,必须简单地从内存中清除获取的数据。因为在清除获取的内存之前,不能在同一个连接上执行另一个 MYSQL 过程。

将这个函数添加到脚本的右端,这样它就会 解决问题

$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch

参考 PHP 文档

这就是我的问题所在! ! !

参数绑定是“动态的”,所以我有一个变量来设置数据的参数,以便使用 Bind _ param。所以这个变量是错误的,但是它没有抛出像“错误的 param 数据”这样的错误,而是说“不同步等等等等”,所以我很困惑..。

我使用 Doctrine DBAL QueryBuilder 遇到了这个错误。

我用 QueryBuilder 创建了一个使用列子选择的查询,也是用 QueryBuilder 创建的。子选择只是通过 $queryBuilder->getSQL()创建的,并没有执行。错误发生在创建第二个子选择时。通过在使用 $queryBuilder->getSQL()之前暂时使用 $queryBuilder->execute()执行每个子选择,一切都工作了。这就好像连接 $queryBuilder->connection在执行当前准备的 SQL 之前创建新 SQL 时仍然处于无效状态,尽管每个子选择上都有新的 QueryBuilder 实例。

我的解决方案是在不使用 QueryBuilder 的情况下编写子选项。

我的问题是,我在同一个页面上使用了 first ready 语句,然后使用 mysqli query,得到了错误“ Commandsout of sync; you can’t run this command now”。只有在使用具有 ready 语句的代码时才会出现错误。

What I did was to close the question. and it worked.

Mysqli _ stmt _ close ($stmt) ;

我的原则

Get _ classy.php (这里使用 ready 语句)

    <?php




global $connection;
$cat_to_delete =    mysqli_real_escape_string($connection, $_GET['get'] );


$sql = "SELECT category_name FROM categories WHERE category_id = ? ;";




$stmt = mysqli_stmt_init($connection);


if (!mysqli_stmt_prepare($stmt, $sql))
$_SESSION['error'] = "Error at preaparing for deleting query. mysqli_stmt_error($stmt) ." & redirect('../error.php');


mysqli_stmt_bind_param($stmt, 's', $cat_to_delete);


if (!mysqli_stmt_execute($stmt))
$_SESSION['error'] = "ERror at executing delete category ".mysqli_stmt_error($stmt) &
redirect('../error.php');




mysqli_stmt_bind_result($stmt, $cat_name);


if (!mysqli_stmt_fetch($stmt)) {
mysqli_stmt_error($stmt);
}






mysqli_stmt_free_result($stmt);
mysqli_stmt_close($stmt);

Admin _ get _ Category _ body. php (这里是 mysqli)

        <?php


if (isset($_GET['get']) && !empty($_GET['get']) )
{
include 'intodb/edit_category.php';
}




if (check_method('get') && isset($_GET['delete']) )
{
require 'intodb/delete_category.php';
}




if (check_method('get') && isset($_GET['get']) )
{
require 'intodb/get_category.php';
}




?>


<!--            start: cat body          -->


<div     class="columns is-mobile is-centered is-vcentered">
<div class="column is-half">
<div   class="section has-background-white-ter box ">




<div class="has-text-centered column    " >
<h4 class="title is-4">Ctegories</h4>
</div>


<div class="column " >




<?php if (check_method('get') && isset($_GET['get'])) {?>
<form action="" method="post">
<?php } else {?>
<form action="intodb/add_category.php" method="post">
<?php } ?>


<label class="label" for="admin_add_category_bar">Add Category</label>
<div class="field is-grouped">


<p class="control is-expanded">


<?php if (check_method('get') && isset($_GET['get'])) {?>


<input id="admin_add_category_bar" name="admin_add_category_bar_edit" class="input" type="text" placeholder="Add Your Category Here" value="<?php echo $cat_name; ?>">


<?php




?>
<?php } else {?>
<input id="admin_add_category_bar" name="admin_add_category_bar" class="input" type="text" placeholder="Add Your Category Here">


<?php } ?>
</p>
<p class="control">
<input type="submit" name="admin_add_category_submit" class="button is-info my_fucking_hover_right_arrow" value="Add Category">
</p>
</div>
</form>




<div class="">


<!--            start: body for all posts inside admin          -->




<table class="table is-bordered">
<thead>
<tr>
<th><p>Category Name</p></th>
<th><p>Edit</p></th>
<th><p>Delete</p></th>
</tr>
</thead>


<?php


global $connection;
$sql = "SELECT * FROM categories ;";


$result = mysqli_query($connection, $sql);
if (!$result) {
echo mysqli_error($connection);
}
while($row = mysqli_fetch_assoc($result))
{
?>
<tbody>
<tr>
<td><p><?php echo $row['category_name']?></p></td>
<td>
<a href="admin_category.php?get=<?php echo $row['category_id']; ?>" class="button is-info my_fucking_hover_right_arrow" >Edit</a>


</td>


<td>
<a href="admin_category.php?delete=<?php echo $row['category_id']; ?>" class="button is-danger my_fucking_hover_right_arrow" >Delete</a>


</td>
</tr>




</tbody>
<?php }?>
</table>


<!--           end: body for all posts inside admin             -->








</div>


</div>
</div>




</div>


</div>
</div>

我刚刚想到的一些事情,我也再次通过全局 $connect 添加连接变量; 。因此,我认为基本上一套全新的查询系统正在用 mysqli _ stmt _ close ($stmt)结束 ready 语句之后启动; 我还通过 include 添加了这些文件和其他东西

一旦你使用

stmt->execute();

关闭 五月以使用另一个查询。

stmt->close();

这个问题困扰了我好几个小时,希望能解决你的问题。

创建两个连接,分别使用它们

$mysqli = new mysqli("localhost", "Admin", "dilhdk", "SMS");


$conn = new mysqli("localhost", "Admin", "dilhdk", "SMS");

另一个原因是: store _ result ()不能调用两次。

例如,在下面的代码中,将打印错误5。

<?php


$db = new mysqli("localhost", "something", "something", "something");


$stmt = $db->stmt_init();
if ($stmt->error) printf("Error 1 : %s\n", $stmt->error);


$stmt->prepare("select 1");
if ($stmt->error) printf("Error 2 : %s\n", $stmt->error);


$stmt->execute();
if ($stmt->error) printf("Error 3 : %s\n", $stmt->error);


$stmt->store_result();
if ($stmt->error) printf("Error 4 : %s\n", $stmt->error);


$stmt->store_result();
if ($stmt->error) printf("Error 5 : %s\n", $stmt->error);

(这可能与最初的示例代码无关,但可能与寻找此错误答案的人有关。)

我正在使用 ODBC,这个修复程序对我很有用: ODBC-> tab System DSN-> 双击以配置我的数据源-> Details-> tab Cursor-> 取消检查[ Don’t cache result of forward-only cursor ]-> 单击 OK

这是一个老问题,但是在我的情况下,所有的回答都不起作用。我发现在我的情况下,我的存储过程中有一个表的选择和更新,同一个表有一个更新触发器,它被触发并将过程发送到一个无限循环中。一旦发现错误,错误就消失了。

我经常碰到这个错误,并且总是在运行一个存储过程时,在 phpmyadmin 或 SQL Workbench 中进行调试(我使用的是连接 mysqli 的 php)。

这个错误是由于调试包括在代码的策略点插入 SELECT 语句来告诉我变量的状态等等。在这些客户机环境中运行一个产生多个结果集的存储过程是可以的,但是从 php 调用时会产生“命令不同步”错误。解决方案是 一直都是注释掉或删除调试选择,这样过程只有一个结果集。

只是作为参考,我有这个问题混合 multi_queryquery在相同的代码:

$connection->multi_query($query);
...
$connection->query($otherQuery);

对于我阅读的内容,有未消耗的结果等待处理,因此导致了上述错误。

我用一个循环消耗所有 multi_query的结果来解决这个问题:

$connection->multi_query($query);
while ($connection->next_result()); // <--- solves the problem
...
$connection->query($otherQuery);

在我的情况下,所有的查询在 multi_query插入,所以我没有兴趣的结果本身。

这个错误的最终解决办法如下:

1)您必须将下一个查询上面的代码复制粘贴到存储过程。

do if($result=mysqli_store_result($myconnection)){ mysqli_free_result($result); } while(mysqli_more_results($myconnection) && mysqli_next_result($myconnection));

在收集完第一个查询的结果之后,我放入了这行代码

mysqli_next_result($connection);