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

2022-08-30 07:21:12

我正在尝试执行我的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子句进行限制,我仍然会得到命令不同步错误。'% ? %'*


答案 1

你不能同时有两个查询,因为mysqli默认使用无缓冲查询(对于预准备语句;对于vanilla则相反)。您可以将第一个查询提取到数组中并循环访问该数组,或者告诉mysqli缓冲查询(使用$stmt->store_result())。mysql_query

有关详细信息,请参阅此处


答案 2

我在我的C应用程序中解决了这个问题 - 这是我是如何做到的:

  1. 引用自 mysql 论坛:

    当您使用应用程序内的分号分隔符终止查询时,会导致此错误。虽然从命令行或在查询浏览器中执行查询时需要使用分号分隔符终止查询,但请从应用程序内的查询中删除分隔符。

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

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

    这是我使用的循环:

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

我不了解PHP,但我确信它有类似的东西。


推荐