我正在尝试执行我的PHP代码,它通过mysqli调用两个MySQL查询,并得到错误"命令不同步;你现在无法运行此命令".
这是我正在使用的代码
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 '' . "\n"; echo ' ' . "\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; } } }'.$row['USERNAME'].' ' . "\n"; echo ''.$row['shortDate'].' ' . "\n"; echo 'DELETE RECORD ' . "\n"; echo '
我试过阅读这个,但我不确定该怎么做.我已经阅读了关于商店结果和免费结果的信息,但是这些在使用它们时没有任何区别.我不确定这个错误到底是哪一点,并且想知道它为什么会被引起,以及如何修复它.
通过我的调试语句,countQuery的第一个if循环甚至没有输入,因为我的sql语法附近有错误'% ? %'
.但是,如果我只是选择*
而不是尝试基于LIKE子句进行限制,我仍然会得到命令不同步错误.
您不能同时拥有两个查询,因为默认情况下mysqli使用无缓冲的查询(对于预处理语句;对于vanilla而言则相反mysql_query
).您可以将第一个获取到数组中并循环遍历,或者告诉mysqli缓冲查询(使用$stmt->store_result()
).
详情请见此处.
我在我的C应用程序中解决了这个问题 - 这是我如何做到的:
从mysql论坛引用:
当您在应用程序内使用分号分隔符终止查询时,会出现此错误.虽然从命令行或查询浏览器执行查询时需要使用分号分隔符终止查询,但请从应用程序内的查询中删除分隔符.
在运行我的查询并处理结果[C API:mysql_store_result()
]之后,我迭代通过多个SQL语句执行发生的任何进一步的潜在未决结果,例如两个或多个select语句(背靠背而不处理结果).
事实是我的程序不会返回多个结果,但是在我执行之前数据库不知道:[C API:mysql_next_result()
].我在一个循环(为了好的测量)中这样做,直到它返回非零.那是当前连接处理程序知道可以执行另一个查询(我缓存我的处理程序以最小化连接开销).
这是我使用的循环:
for(; mysql_next_result(mysql_handler) == 0;) /* do nothing */;
我不知道PHP,但我确信它有类似的东西.
我今天有同样的问题,但只有在使用存储过程时.这使得查询的行为类似于多查询,因此您需要在进行其他查询之前"使用"其他可用结果.
while($this->mysql->more_results()){ $this->mysql->next_result(); $this->mysql->use_result(); }
每次使用$ mysqli-> query之前我都会调用此函数.也可以使用存储过程.
function clearStoredResults(){ global $mysqli; do { if ($res = $mysqli->store_result()) { $res->free(); } } while ($mysqli->more_results() && $mysqli->next_result()); }