Я знаю, что есть много ответов, а также принятых ответов, связанных с этим вопросом, но ни один из них не решает мою проблему. Тем не менее я получаю эту ошибку.
Процедуры:
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 $
Я обнаружил, что проблема возникает, только если я запускаю два запроса.
Как 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 ()
после того, как вы сделали с набором результатов.
По сути, вы должны сказать своему клиенту, что он должен делать с результатом.
Обычно эта ошибка возникает из-за того, что в запросе все еще ожидают результаты. Есть mysqli_store_result
а также mysqli_free_result
функции доступны. Так как вы используете mysql
а также mysql
Расширение не имеет таких функций, вы можете попытаться закрыть соединение после выполнения первой процедуры и установить соединение снова, чтобы выполнить следующую процедуру. Хотя это не идеальное решение, но оно будет работать в вашем случае.
mysql_close($connection);
$connection = mysql_connect("localhost","username","password");
Вы также можете попробовать
mysql_free_result($allProducts);
Хранимые процедуры всегда возвращают дополнительный набор результатов с информацией об ошибках / предупреждениях. Таким образом, ваши хранимые процедуры возвращаются множественный наборы результатов (фактический набор результатов из вашего запроса на выборку и дополнительный набор результатов ошибок / предупреждений). призвание mysql_fetch_array
в цикле вы только насыщаете одного из них, оставляя другого в ожидании, вызывая ошибку, которую вы видите.
Я не знаю, как это исправить с помощью ванили mysql_
библиотека, с mysqli_
вы можете выдать mysqli_multi_query
, а затем использовать только первый набор результатов. См пример в документах.
Это не исправление само по себе, но если вы настаиваете на том, чтобы остаться с функциями mysql_ *, и предполагаете, что вы действительно хотите работать с более сложными хранимыми процедурами (то есть те, которые вы предоставили, являются просто упрощенным примером) — вы можете изменить хранимые код процедур для записи результирующего набора во временную таблицу (например, tmp_getAllProducts) вместо того, чтобы вернуть его, а затем ВЫБРАТЬ из этого в вашем PHP.
Это то, что работало для меня некоторое время назад, когда я застрял с mysql_ * и не смог обновить …
Это известное ограничение расширения mysql. Вы не должны использовать более одной хранимой процедуры для каждого соединения или обновиться до mysqli.