我正在尝试执行我的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;
}
}
}
我试过仔细阅读这篇文章,但我不知道该怎么办。我读过关于存储结果和免费结果的文章,但是在使用它们的时候它们并没有什么区别。我不确定这个错误究竟是在哪一点造成的,我想知道为什么会造成这个错误,以及如何修复它。
根据我的调试语句,countquery的第一个if循环甚至没有被输入,因为我的sql语法中有一个错误 '% ? %'
. 但是如果我选择 *
我没有尝试基于like子句进行限制,而是仍然得到命令不同步错误。
21条答案
按热度按时间im9ewurl1#
检查输入的所有参数是否正确。如果定义并传递给函数的参数数量不同,则抛出相同的错误。
i7uq4tfw2#
我的问题是,我使用的是第一个prepare语句,然后在同一页上使用mysqli查询,得到的错误是“命令不同步;现在不能运行此命令”。当我使用包含prepare语句的代码时,才出现错误。
我所做的就是结束这个问题。而且成功了。
mysqli\u stmt\u close($stmt);
我的代码
get_category.php(这里使用prepare语句)
admin\u get\u category\u body.php(这里是mysqli)
我突然想到,我还通过global$connection;再次添加了连接变量;。所以我认为在prepare语句以mysqli\u stmt\u close($stmt)结尾之后,基本上一套全新的查询系统正在启动;我还通过include添加了这些文件和其他东西
pzfprimi3#
您不能同时有两个查询,因为mysqli在默认情况下使用无缓冲查询(对于准备好的语句;香草正好相反
mysql_query
). 您可以将第一个查询提取到一个数组中并在其中循环,或者告诉mysqli缓冲查询(使用$stmt->store_result()
).详见此处。
sd2nnvve4#
这就是我的问题所在!!!
param绑定是“动态”的,所以我有一个变量来设置数据的参数,以便使用bind\u param。所以这个变量是错误的,但不是抛出一个像“错误的参数数据”这样的错误,它说“不同步blablablabla”,所以我很困惑。。。
w8f9ii695#
我在我的c应用程序中解决了这个问题-我是这样做的:
引用mysql论坛:
当您在应用程序中使用分号分隔符终止查询时,会出现此错误。在命令行或查询浏览器中执行查询时,需要使用分号分隔符终止查询,但请从应用程序内部的查询中删除分隔符。
在运行我的查询并处理结果之后[c api:
mysql_store_result()
],我将遍历通过多个sql语句执行(例如两个或多个select语句)出现的任何其他潜在的挂起结果(背对背,不处理结果)。事实上,我的过程不会返回多个结果,但在我执行[c api:
mysql_next_result()
]. 我在一个循环中这样做(为了更好的测量),直到它返回非零。此时,当前连接处理程序知道可以执行另一个查询(我缓存处理程序以最小化连接开销)。这是我使用的循环:
我不知道php,但我肯定它也有类似的东西。
c8ib6hqw6#
要解决这个问题,必须先存储结果数据,然后再使用它
这就是全部
mrfwxfqh7#
这是一个老问题,但在我的例子中,没有一个发布的答案起作用,我发现在我的例子中,我对存储过程中的一个表进行了selects和updates,同一个表有一个update触发器,该触发器正在被触发,并将过程发送到一个无限循环中。一旦发现错误,错误就消失了。
gwbalxhn8#
我今天也遇到了同样的问题,但只是在处理存储过程时。这使得查询的行为类似于多重查询,因此在进行另一个查询之前,您需要“使用”其他可用的结果。
nhjlsmyf9#
我用代码点火器。一台服务器正常。。。这个可能更老。。。无论如何使用
修好了。
roqulrg310#
我认为问题是你在函数中建立了一个新的连接,但最后没有关闭它。为什么不尝试传入现有连接并重新使用它呢?
另一种可能是,您正在从while循环获取过程中返回。你永远不会完成那次外拍。
ut6juiuv11#
创建两个连接,分别使用这两个连接
0lvr5msh12#
我正在使用odbc,这个补丁对我很有用:odbc->tab system dsn->双击配置我的数据源->详细信息->tab游标->取消选中[不缓存仅转发游标的结果]->单击确定
wlsrxk5113#
我经常遇到这个错误,而且总是在phpmyadmin或sqlworkbench(我正在用php连接mysqli)中调试存储过程的时候。
这个错误是由于调试涉及在代码中的策略点插入select语句来告诉我变量的状态等。在这些客户机环境中运行一个生成多个结果集的存储过程是可以的,但是从php调用时会产生“commands-out-of-sync”错误。解决方法总是注解掉或删除调试选择,这样过程只有一个结果集。
y0u0uwnf14#
仅供参考,我在混合两者时遇到了问题
multi_query
以及query
同样的代码:就我所读的内容而言,它有未使用的结果挂起,因此导致了上述错误。
我用一个循环解决了这个问题,循环消耗了
multi_query
:在我看来
multi_query
所以我对结果本身没有兴趣。sd2nnvve15#
问题是mysql客户机c库,大多数mysql api都是基于这个库构建的。问题是c库不支持同时执行查询,因此所有在此基础上构建的API也不支持。即使使用非缓冲查询。这就是编写异步mysql api的原因之一。它使用tcp直接与mysql服务器通信,wire协议支持同时查询。
您的解决方案是要么修改算法,这样就不需要同时进行这两个过程,要么将它们更改为使用缓冲查询,这可能是它们在c库中存在的原始原因之一(另一个原因是提供一种游标)。