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

Jos*_*he4 86 php mysql sql mysqli

我正在尝试执行我的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我试过阅读这个,但我不确定该怎么做.我已经阅读了关于商店结果和免费结果的信息,但是这些在使用它们时没有任何区别.我不确定这个错误到底是哪一点,并且想知道它为什么会被引起,以及如何修复它.

通过我的调试语句,countQuery的第一个if循环甚至没有输入,因为我的sql语法附近有错误'% ? %'.但是,如果我只是选择*而不是尝试基于LIKE子句进行限制,我仍然会得到命令不同步错误.

小智 108

您不能同时拥有两个查询,因为默认情况下mysqli使用无缓冲的查询(对于预处理语句;对于vanilla而言则相反mysql_query).您可以将第一个获取到数组中并循环遍历,或者告诉mysqli缓冲查询(使用$stmt->store_result()).

详情请见此处.

  • 你*可以*同时有两个查询 - 你只需要运行`$ stmt-> store_result();`我认为你的回答应该更清楚. (17认同)
  • 我同意,mysqli有点脑损伤.它_does_用PDO mysql驱动程序做正确的事情. (2认同)
  • 花了我很多时间来找到这些信息 - 没有它在哪里容易显示.谢谢.我只是用`$ select_stmt-> close();`分隔我的查询来拆分它们(不是同时的,而是程序的) (2认同)

小智 31

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

  1. 从mysql论坛引用:

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

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

    事实是我的程序不会返回多个结果,但是在我执行之前数据库不知道:[C API:mysql_next_result()].我在一个循环(为了好的测量)中这样做,直到它返回非零.那是当前连接处理程序知道可以执行另一个查询(我缓存我的处理程序以最小化连接开销).

    这是我使用的循环:

    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    
    Run Code Online (Sandbox Code Playgroud)

我不知道PHP,但我确信它有类似的东西.

  • 这对我来说.在PHP中我刚添加:while(mysqli_next_result($ con)); (10认同)

小智 16

我今天有同样的问题,但只有在使用存储过程时.这使得查询的行为类似于多查询,因此您需要在进行其他查询之前"使用"其他可用结果.

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
Run Code Online (Sandbox Code Playgroud)


Jue*_*gen 8

每次使用$ mysqli-> query之前我都会调用此函数.也可以使用存储过程.

function clearStoredResults(){
    global $mysqli;

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

}
Run Code Online (Sandbox Code Playgroud)


ice*_*ice 8

一旦你使用

stmt->execute();
Run Code Online (Sandbox Code Playgroud)

可以关闭它以使用另一个查询。

stmt->close();
Run Code Online (Sandbox Code Playgroud)

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

  • 没有必要结束该声明。正如 @stalinbeltran 上面回答的那样,我们需要在准备另一个语句之前“消耗”一个语句的结果。所以,`$stmt1-&gt;execute(); $stmt2=$conn-&gt;prepare(...)` 会给出这个错误,但是 `$stmt1-&gt;execute(); $result1=$stmt1-&gt;get_result(); $stmt2=$conn-&gt;prepare(...)` 就可以了。 (2认同)

小智 5

我使用 CodeIgniter。一台服务器还可以……这台可能更旧了……无论如何使用

$this->db->reconnect();
Run Code Online (Sandbox Code Playgroud)

修复。

  • 这如何解决这个问题? (7认同)
  • @Norman,这不能“解决”问题。它只是通过丢弃整个连接并再次重新连接来**避免**它。从性能的角度来看,这完全没有意义。 (4认同)