不同步的命令; 你现在不能运行这个命令

我试图执行我的PHP代码,通过mysqli调用两个MySQL查询,并得到错误“命令不同步,你现在不能运行这个命令”。

这是我正在使用的代码

<?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; } } } 

我已经试过读这个,但我不知道该怎么做。 我已阅读关于商店的结果和免费的结果,但是使用它们时没有什么区别。 我不确定这个错误是由什么原因造成的,并且想知道为什么会造成这个错误,以及如何解决这个问题。

通过我的debugging语句,countQuery的第一个if循环甚至没有被input,因为我的SQL语法附近错误'% ? %' '% ? %' 。 但是,如果我只是select*而不是试图根据LIKE子句进行限制,我仍然得到命令的同步错误。

你不能有两个同时的查询,因为默认情况下mysqli使用未缓冲的查询(对于准备好的语句;这与vanilla mysql_query相反)。 您可以将第一个数据读取到数组中并循环,或者通过mysqli来caching查询(使用$stmt->store_result() )。

详情请看这里 。

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

  1. 从MySQL论坛引用:

    当您在应用程序中用分号分隔符终止您的查询时,会出现此错误。 当从命令行或查询浏览器执行查询时,需要使用分号分隔符来终止查询,而在应用程序内的查询中删除分隔符。

  2. 在运行我的查询并处理结果[C API: mysql_store_result() ]之后,我迭代通过多个SQL语句执行发生的任何进一步潜在的挂起结果,如两个或多个select语句(背对背而不处理结果) 。

    事实是,我的程序不返回多个结果,但数据库不知道,直到我执行:[C API: mysql_next_result() ]。 我在一个循环中做这个(为了好的措施),直到它返回非零。 这就是当前连接处理程序知道可以执行另一个查询(我caching我的处理程序,以最大限度地减less连接开销)。

    这是我使用的循环:

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

我不知道PHP,但我相信它有类似的东西。

我今天有同样的问题,但只有当使用存储过程。 这使查询的行为就像是一个多重查询,因此在进行另一个查询之前,您需要“使用”其他可用的结果。

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

我使用CodeIgniter。 一台服务器确定…这一个可能更旧…无论如何使用

 $this->db->reconnect(); 

修复。

问题是MySQL客户端C库,大多数MySQL API都是build立在这个库上的。 问题是C库不支持同时执行查询,因此所有构build在其上的API也不支持。 即使您使用未缓冲的查询。 这是编写asynchronousMySQL API的一个原因。 它使用TCP直接与MySQL服务器进行通信,并且有线协议确实支持同时查询。

你的解决scheme是修改algorithm,所以你不需要同时进行这两种algorithm,或者改变它们来使用缓冲查询,这可能是C库存在的原因之一(另一种是提供一种游标)。

我在每次使用$ mysqli-> query查询使用存储过程之前都调用这个函数。

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

我认为问题在于你在函数中build立了一个新的连接,然后在最后closures它。 你为什么不尝试传递现有的连接并重新使用它?

另一种可能是你正在从一个while循环中取出。 你永远不会完成外部抓取。

要解决这个问题,你必须在使用前存储结果数据

 $numRecords->execute(); $numRecords->store_result(); 

就这样

检查是否正确input所有参数。 如果定义的参数的数量和传递给函数的数量不同,它会抛出相同的错误。

这与原来的问题没有关系,但是我有同样的错误信息,而且这个线程是Google中的第一个命中,我花了一段时间才弄清楚问题是什么,所以可能对其他人有用:

我不使用mysqli,仍然使用mysql_connect我有一些简单的querys,但一个查询导致所有其他querys在同一个连接失败。

我使用MySQL 5.7和PHP 5.6我有一个表与数据types“JSON”。 显然,我的php版本不能识别mysql的返回值(PHP只是不知道如何处理JSON格式,因为内置的mysql模块太旧了(至less我认为))

现在我改变了JSON字段types为文本(因为现在我不需要原生mysql JSONfunction),一切工作正常

实际上,我在SQLyog中遇到了这些问题

不同步的命令; 你现在不能运行这个命令

我只是重新启动SQLyog,我已经解决了这个问题。