Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/248.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么mysqli会给出一个“答案”;“命令不同步”;错误?_Php_Mysql_Mysqli - Fatal编程技术网

Php 为什么mysqli会给出一个“答案”;“命令不同步”;错误?

Php 为什么mysqli会给出一个“答案”;“命令不同步”;错误?,php,mysql,mysqli,Php,Mysql,Mysqli,我正在尝试运行以下程序 <?php $db = mysqli_connect("localhost","user","pw") or die("Database error"); mysqli_select_db($db, "database"); $agtid = $_POST['level']; $sql = sprintf("call agent_hier(%d)", $agtid); $result = mysqli_query($db, $sql) or exit(mys

我正在尝试运行以下程序

<?php

$db = mysqli_connect("localhost","user","pw") or die("Database error");
mysqli_select_db($db, "database");

$agtid = $_POST['level'];

$sql = sprintf("call agent_hier(%d)", $agtid);

$result = mysqli_query($db, $sql) or exit(mysqli_error($db));

if ($result) {
    echo "<table border='1'>
        <tr><th>id</th>
        <th>name</th>
        <th>parent_id</th>
        <th>parent_name</th>
        <th>level</th>
        <th>email</th></tr>";

    while ($row = mysqli_fetch_assoc($result)) 
    {
        $aid = $row["id"];
        $sql2 = "SELECT * FROM members WHERE MEMNO = '$aid'";
        $result2 = mysqli_query($db,$sql2) or exit(mysqli_error($db));

            while ($newArray = mysqli_fetch_array($result2)) {
                $fname = $newArray['FNAME'];
                $lname = $newArray['LNAME'];
                $mi = $newArray['MI'];  
                $address = $newArray['ADDRESS'];    
                $city = $newArray['CITY'];  
                $state = $newArray['STATE'];    
                $zip = $newArray['ZIP'];
                            $kdate = $newArray['KDATE'];
                $date = abs(strtotime(date('m/d/Y')) - strtotime(date($kdate))) / (60 * 60 * 24);
            }

        echo sprintf("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>",
            $row["id"],$row["name"],
            $row["parent_id"],$row["parent_name"],
            $row["level"],$row["email"]);
    }

    echo "</table>";
}

mysqli_free_result($result);
mysqli_close($db);

?>

  $date = abs(strtotime(date('m/d/Y')) - strtotime(date($kdate))) / (60 * 60 * 24);
  }
一切都会好起来的。如果不是,我会得到以下错误:

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

在研究中,我认为这可能是由于多个MySQLi查询同时运行,其中使用
MySQLi\u multi\u query
,但对于中的所有样本和常规数据似乎并不适用


有什么想法吗?

MySQL客户端不允许您在仍有行要从正在进行的查询中提取的情况下执行新查询。请参阅MySQL文档中的常见错误

您可以使用预取外部查询中的所有行。这将在MySQL客户端中缓冲它们,因此从服务器的角度来看,您的应用程序已经获取了完整的结果集。然后,即使在从现在已缓冲的外部结果集中获取行的循环中,也可以执行更多查询

或者,您可以将完整的结果集作为PHP数组返回,然后可以在该数组上循环

调用存储过程是一种特殊情况,因为存储过程可能返回多个结果集,每个结果集可能有自己的行集。这就是为什么@a1ex07的答案提到使用
mysqli\u multi\u query()
并循环直到
mysqli\u next\u result()
没有更多的结果集。这对于满足MySQL协议是必需的,即使您的存储过程只有一个结果集


顺便说一下,我看到您正在进行嵌套查询,因为您有表示层次结构的数据。您可能需要考虑以不同的方式存储数据,这样您就可以更容易地查询它。我做了一个关于这个主题的演讲。我在书中的一章中也谈到了这个话题


下面是如何在CodeIgnitor 3.0.3中实现
mysqli\u next\u result()

system/database/drivers/mysqli/mysqli_driver.php
change的第262行

protected function _execute($sql)
{
    return $this->conn_id->query($this->_prep_query($sql));
}
对此

protected function _execute($sql)
{
    $results = $this->conn_id->query($this->_prep_query($sql));
    @mysqli_next_result($this->conn_id); // Fix 'command out of sync' error
    return $results;
}
自2.x以来,这一直是一个问题。我刚刚更新到3.x,不得不将此黑客代码复制到新版本。

简单地说, 在调用mysqli_free_结果之后,您必须调用mysqli_next_result($db)

mysqli_免费_结果($result); mysqli\u下一个结果($db)
mysqli_close($db)

只需调用此函数:

$this->free_result();

function free_result() {
        while (mysqli_more_results($this->conn) && mysqli_next_result($this->conn)) {

            $dummyResult = mysqli_use_result($this->conn);

            if ($dummyResult instanceof mysqli_result) {
                mysqli_free_result($this->conn);
            }
        }
    }

如果您还对存储过程进行了一些调用,并且遇到了上述错误,那么Wayne先生,我为您提供了一个解决方案

嗯,在下面的某个地方,
调用
存储过程实际上打乱了连接。因此,您所要做的就是重置数据库连接句柄

您甚至可以在配置文件中有一个函数专门为您执行此操作,您所做的只是在对
存储过程进行任何
查询之前调用该函数一次

我的实现是(忽略
$app
,因为我正在使用
silex
框架,它就在那里,YMMV)


您必须关闭存储过程保持的上一个连接。 不必每次都关闭连接,您只需使用:

mysqli_next_result($conn);

其中是行
$date=abs(strotime(日期('m/d/Y'))-strotime(日期($kdate))/(60*60*24);}在您的代码中?你说如果你移到它上面,但我在那里看不到。谢谢你的建议。我最终以一种在另一个php页面()上更有意义的方式解决了我自己的问题(到目前为止…)。顺便说一句,很棒的演示文稿-我需要实时演示,但看起来很有价值。然而,乍一看,由于我使用的是MySQL,这对我来说可能是个麻烦。我确信类似的理论应用了很好的答案,帮助我解决了类似的问题。谢谢即使我们只有一个使用数据库对象的查询,我们仍然应该调用
mysqli\u next\u result()
?是的,活动查询不会“清除”,除非它确认没有更多的结果集要处理。“搞乱了连接”怎么做?这是正确的答案。@Pacerier-在每次查询之前总是调用
mysqli\u next\u result
有什么不利之处吗?除了轻微的气味;理想情况下,我会追踪是什么让连接处于不完整状态,但我会在那里调用它,所以我想总是调用它,然后继续。
function flushhandle() {

    global $app;
    global $db_host;
    global $db_user;
    global $db_pass;
    global $db_name;
    $app['mysqlio']->close();
    $app['mysqlio'] = new mysqli($db_host, $db_user, $db_pass, $db_name);
    return $app['mysqlio'];
}
mysqli_next_result($conn);