PHP mysqli Команды не синхронизированы; вы не можете запустить эту команду сейчас

В моем db у меня есть несколько хранимых процедур.

Я хочу позвонить одному из них, и, согласно результатам, полученным из этой процедуры, я определяю, как погода вызывает второе или нет.

Как вы можете видеть в isUserValid() я использовал $result->free_results()

но при вызове другой процедуры я получаю: Commands out of sync; you can't run this command now Commands out of sync; you can't run this command now

Это мое призвание к функциям db:

  /** * 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; } 

Solutions Collecting From Web of "PHP mysqli Команды не синхронизированы; вы не можете запустить эту команду сейчас"

Каждая хранимая процедура возвращает не менее двух результатов

  • один (или много) фактических результатов
  • один пустой результат, чтобы сообщить клиенту, что результатов больше нет.

Вы должны использовать mysqli_more_results() / mysqli_next_result() для их очистки.

Если ваша процедура возвращает только один результат или вам просто не нужны дополнительные результаты, но первая, вы можете очистить очередь результатов с помощью этого фрагмента кода:

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

В настоящее время принятый ответ не работает как есть, я думаю, что next_result() не следует вызывать перед первым результатом.

Это пример, который работает:

 if (!$mysqli->multi_query("CALL p()")) { echo "CALL failed: (" . $mysqli->errno . ") " . $mysqli->error; } do { if ($res = $mysqli->store_result()) { printf("---\n"); var_dump($res->fetch_all()); $res->free(); } else { if ($mysqli->errno) { echo "Store failed: (" . $mysqli->errno . ") " . $mysqli->error; } } } while ($mysqli->more_results() && $mysqli->next_result()); 

Из руководства по PHP http://php.net/manual/en/mysqli.quickstart.stored-procedures.php

re connect database $this->db->reconnect(); // likes in codeigniter $this->db->reconnect(); // likes in codeigniter