Ошибка: команды не синхронизированы; Вы не можете запустить эту команду сейчас

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

Процедуры:

CREATE PROCEDURE getAllProducts()
BEGIN
SELECT * FROM products;
END //

CREATE PROCEDURE getAllCategories()
BEGIN
SELECT * FROM category;
END //

соединение & призвание:

$link = mysql_connect($host,$username,$password) or die(mysql_error());
mysql_select_db($database, $link) or die(mysql_error());

$allProducts = mysql_query("CALL getAllProducts");
while($row = mysql_fetch_array($allProducts)) { }

$allCategory = mysql_query("CALL getAllCategories");
while($row = mysql_fetch_array($allCategory)) { }

Я даже звонил mysql_free_result($allProducts) перед выполнением следующего запроса. Но ничего не происходит.

mysql_get_client_info() вернуть mysqlnd 5.0.5-dev - 081106 - $Revision: 1.3.2.27 $

Я обнаружил, что проблема возникает, только если я запускаю два запроса.

-3

Решение

Как MySQL-Документация для «Команды не синхронизированы» указывает на то:

[…] Это также может произойти, если вы попытаетесь выполнить два запроса, которые возвращают данные
без вызова mysql_use_result () или mysql_store_result () между ними.

Документация для mysql_use_result () говорит например:

После вызова mysql_query () или mysql_real_query () вы должен вызов
mysql_store_result () или mysql_use_result () для каждого оператора, который
успешно создает набор результатов (SELECT, SHOW, DESCRIBE, EXPLAIN,
ПРОВЕРИТЬ ТАБЛИЦУ и т. Д.). Вы должен также вызовите mysql_free_result ()
после того, как вы сделали с набором результатов.

По сути, вы должны сказать своему клиенту, что он должен делать с результатом.

0

Другие решения

Обычно эта ошибка возникает из-за того, что в запросе все еще ожидают результаты. Есть mysqli_store_result а также mysqli_free_result функции доступны. Так как вы используете mysql а также mysql Расширение не имеет таких функций, вы можете попытаться закрыть соединение после выполнения первой процедуры и установить соединение снова, чтобы выполнить следующую процедуру. Хотя это не идеальное решение, но оно будет работать в вашем случае.

mysql_close($connection);
$connection = mysql_connect("localhost","username","password");

Вы также можете попробовать

    mysql_free_result($allProducts);
0

Хранимые процедуры всегда возвращают дополнительный набор результатов с информацией об ошибках / предупреждениях. Таким образом, ваши хранимые процедуры возвращаются множественный наборы результатов (фактический набор результатов из вашего запроса на выборку и дополнительный набор результатов ошибок / предупреждений). призвание mysql_fetch_array в цикле вы только насыщаете одного из них, оставляя другого в ожидании, вызывая ошибку, которую вы видите.

Я не знаю, как это исправить с помощью ванили mysql_ библиотека, с mysqli_ вы можете выдать mysqli_multi_query, а затем использовать только первый набор результатов. См пример в документах.

0

Это не исправление само по себе, но если вы настаиваете на том, чтобы остаться с функциями mysql_ *, и предполагаете, что вы действительно хотите работать с более сложными хранимыми процедурами (то есть те, которые вы предоставили, являются просто упрощенным примером) — вы можете изменить хранимые код процедур для записи результирующего набора во временную таблицу (например, tmp_getAllProducts) вместо того, чтобы вернуть его, а затем ВЫБРАТЬ из этого в вашем PHP.

Это то, что работало для меня некоторое время назад, когда я застрял с mysql_ * и не смог обновить …

0

Это известное ограничение расширения mysql. Вы не должны использовать более одной хранимой процедуры для каждого соединения или обновиться до mysqli.

https://bugs.php.net/bug.php?id=39727

0
По вопросам рекламы [email protected]