PHP mysqli Commands out of sync; you can#39;t run this command now(PHP mysqli 命令不同步;你现在不能运行这个命令)
问题描述
在我的数据库中,我有一些存储过程.
In my db I have some stored procedures.
我想打电话给其中一个,根据我从这个程序得到的结果,我会决定天气是否打电话给第二个.
I want to call the one of them, and according to the results I get from this procedure, i will determine weather to call the second one or not.
正如您在 isUserValid() 方法中看到的,我使用了 $result->free_results()
As you can see in the isUserValid() method I've used $result->free_results()
但仍然在调用另一个过程时我得到:命令不同步;你现在不能运行这个命令
but still when calling the other procedure I get: Commands out of sync; you can't run this command now
这是我对 db 函数的调用:
This is my calling to the db functions:
    /**
     * Run a new query on the db.
     * this will open an close the connection to the db
     * @param $query string the query to run
     * @param $verifyAccessToken boolean true if user validation is needed before query is executed, false otherwise
     * @return bool|mysqli_result the result of the query if any or true or false in a non query
     * @throws Exception on connection and query errors
     */
    private function queryDb($query,$verifyAccessToken)
    {
       // if ($this->test)
//            echo $query . "<br>";
        //create a new mysqli connection
        $mysqli = new mysqli($this->DB_HOST, $this->DB_USER, $this->DB_PASS, $this->DB_NAME);
        //set the charset for the connection
        if (!$mysqli->set_charset("utf8"))
        {
            $mysqli->close();
            throw new Exception ("Error setting UTF 8 DB connection");
        }
        //check if the connection was ok
        if (mysqli_connect_errno())
        {
            $mysqli->close();
            throw new Exception("Error connecting DB");
        }
        //if verification is needed - verify access token
       if ($verifyAccessToken && !$this->isUserValid($mysqli))
       {
          $mysqli->close();
          throw new Exception(ACCESS_TOKEN_INCORRECT);
       }
        //get results
        $result = $mysqli->query($query);
        //check if there were now error in query. if so - throw an exception
        if (!$result)
        {
            $mysqlError = $mysqli->error . __LINE__;
            //close the connection
            $mysqli->close();
            throw new Exception ("mySQL Error: " . $mysqlError);
        }
        //fetch the results into an array
        $rows = $result->fetch_all(MYSQLI_BOTH);
        //close the connection
        $result->close();
        $result->free();
        $mysqli->close();
        //return the results if any
        return $rows;
    }
    /**
     * Check if user is valid
     * @param $mysqli mysqli connection to db
     * @return true if user is valid, false otherwise
     */
    function isUserValid($mysqli)
    {
        //Check if there is a saved access token. if not - throw an exception
        if (is_null($this->user) || $this->user->getPicoAccessToken() == null)
          throw new Exception(ACCESS_TOKEN_INCORRECT);
        //get user details
        $facebookId = $this->user->getFacebookId();
        $picoAccessToken = $this->user->getPicoAccessToken();
        //create verification query
        $verificationQuery = "Call isUserValid('$facebookId','$picoAccessToken')";
        //execute query
        $result = $mysqli->query($verificationQuery);
        //if query had error - throw exception
        if (!$result)
        {
         $mysqlError = $mysqli->error . __LINE__;
         //close the connection
         $mysqli->close();
         throw new Exception ("mySQL Error: " . $mysqlError);
        }
        $rows = $result->fetch_all(MYSQLI_ASSOC);
        $rows = $rows[0];
        $result->free_result();
        //return user valid status
        return isset($rows["isUserValid"]) && $rows["isUserValid"] == 1;
    }
推荐答案
每个存储过程至少返回两个结果
Every stored procedure returns at least two results
- 一个(或多个)实际结果
 - 一个空的结果告诉客户没有更多的结果.
 
你必须使用 mysqli_more_results()/mysqli_next_result() 来清理它们.
You have to use mysqli_more_results()/mysqli_next_result() to clean them.    
如果您的过程只返回一个结果,或者您只想要第一个结果之外的任何额外结果,您可以使用以下代码片段清理结果队列:
If your procedure returns only one result, or you just don't want any extra results but the first one, you can clean up the results queue with this code snippet:
while($mysqli->more_results())
{
    $mysqli->next_result();
    if($res = $mysqli->store_result())
    {
        $res->free(); 
    }
}
                        这篇关于PHP mysqli 命令不同步;你现在不能运行这个命令的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:PHP mysqli 命令不同步;你现在不能运行这个命令
				
        
 
            
        基础教程推荐
- 将变量从树枝传递给 js 2022-01-01
 - Yii2 - 在运行时设置邮件传输参数 2022-01-01
 - Web 服务器如何处理请求? 2021-01-01
 - PHPUnit 的 Selenium 2 文档到底在哪里? 2022-01-01
 - 如何在数学上评估像“2-1"这样的字符串?产生“1"? 2022-01-01
 - 主题化 Drupal 7 的 Ubercart “/cart"页 2021-01-01
 - php 7.4 在写入变量中的 Twig 问题 2022-01-01
 - 使用 scandir() 在目录中查找文件夹 (PHP) 2022-01-01
 - php中的PDF导出 2022-01-01
 - php中的foreach复选框POST 2021-01-01
 
    	
    	
    	
    	
    	
    	
    	
    	
				
				
				
				