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

Я пытаюсь выполнить свой PHP-код, который вызывает два MySQL-запроса через mysqli и получает ошибку «Команды не синхронизированы, вы не можете запустить эту команду сейчас».

Вот код, который я использую

<?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; } } } 

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

Идя по моим операциям отладки, первый цикл if для countQuery даже не вводится из-за ошибки в моем синтаксисе sql рядом с '% ? %' '% ? %' . Однако, если я просто выбираю * вместо того, чтобы пытаться ограничиться основанием предложения LIKE, я все равно получаю команду от ошибки синхронизации.

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

У вас не может быть двух одновременных запросов, потому что mysqli по умолчанию использует небуферизованные запросы (для подготовленных операторов, для vanilla mysql_query ). Вы можете либо перенести первый в массив и пройти через него, либо сообщить mysqli для буферизации запросов (используя $stmt->store_result() ).

Подробнее см. Здесь .

Я решил эту проблему в своем приложении C – вот как я это сделал:

  1. Цитата из форумов mysql:

    Эта ошибка возникает, когда вы завершаете запрос с помощью разделителя с запятой внутри приложения . Хотя для завершения запроса с разделителем с запятой при выполнении его из командной строки или в браузере запроса удалите разделитель из запроса внутри приложения.

  2. После выполнения моего запроса и обработки результатов [C API: mysql_store_result() ], я перебираю любые дальнейшие потенциально ожидающие результатов, которые возникают при выполнении нескольких операторов SQL, таких как два или более оператора выборки (спина к спине, не касаясь результатов) ,

    Дело в том, что мои процедуры не возвращают несколько результатов, но база данных не знает, что до выполнения: [C API: mysql_next_result() ]. Я делаю это в цикле (для хорошей меры), пока не вернет ненулевое значение. Вот когда текущий обработчик подключений знает, что можно выполнить другой запрос (я кэширую свои обработчики, чтобы минимизировать накладные расходы на соединение).

    Это цикл, который я использую:

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

Я не знаю PHP, но я уверен, что у него что-то похожее.

У меня была такая же проблема, но только при работе с хранимой процедурой. Это заставляет запрос вести себя как многопроцессорный запрос, поэтому вам нужно «использовать» другие результаты, чтобы сделать другой запрос.

 while($this->mysql->more_results()){ $this->mysql->next_result(); $this->mysql->use_result(); } в while($this->mysql->more_results()){ $this->mysql->next_result(); $this->mysql->use_result(); } 

Я использую CodeIgniter. Один сервер ОК … этот, вероятно, старше … Во всяком случае, используя

 $this->db->reconnect(); 

Починил это.

Проблема состоит в том, что библиотека MySQL клиента C, на которой построено большинство MySQL API. Проблема в том, что библиотека C не поддерживает одновременное выполнение запросов, поэтому все API, построенные поверх этого, также нет. Даже если вы используете небуферизованные запросы. Это одна из причин, по которой был написан асинхронный API MySQL. Он напрямую связывается с сервером MySQL с использованием TCP, а проводной протокол поддерживает одновременные запросы.

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

Я вызываю эту функцию каждый раз перед использованием $ mysqli-> query Работает с хранимыми процедурами.

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

Я думаю, проблема в том, что вы создаете новое соединение в функции, а затем не закрываете ее в конце. Почему бы вам не попробовать перейти в существующее соединение и повторно использовать его?

Другая возможность заключается в том, что вы возвращаетесь из середины цикла. Вы никогда не завершаете эту внешнюю выборку.

для решения этой проблемы вы должны хранить данные результата перед ее использованием.

 $numRecords->execute(); $numRecords->store_result(); 

это все

Проверьте правильность ввода всех параметров. Он выдает ту же ошибку, если количество параметров, определенных и переданных функции, различно.

Это не связано с исходным вопросом, но у меня было такое же сообщение об ошибке, и этот поток стал первым хитом в Google, и мне потребовалось некоторое время, чтобы выяснить, в чем проблема, поэтому он может быть полезен другим:

Я НЕ использую mysqli, все еще используя mysql_connect. У меня были простые запросы, но один запрос заставлял все другие запросы терпеть неудачу в одном и том же соединении.

Я использую mysql 5.7 и php 5.6 У меня была таблица с типом данных «JSON». очевидно, моя php-версия не распознала возвращаемое значение из mysql (php просто не знал, что делать с JSON-Format, потому что встроенный mysql-модуль был слишком старым (по крайней мере, я думаю))

на данный момент я сменил JSON-Field-Type на Text (так как сейчас мне не нужны собственные функции mysql JSON), и все работает отлично

На самом деле, я столкнулся с этими проблемами в SQLyog

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

Я просто перезагрузил SQLyog, и я решил проблему.