Commands out of sync

Если получена ошибка Commands out of sync; you can’t run this command now в клиентском коде, то клиентские функции вызываются в неправильном порядке!

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

Ошибка в клиенте Commands out of sync

Е сли получена ошибка Commands out of sync; you can’t run this command now в клиентском коде, то клиентские функции вызываются в неправильном порядке!

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

П олучение следующей ошибки:

Found wrong password for user: ‘some_user@some_host’; ignoring user означает, что при запуске mysqld или при перезагрузке таблиц привилегий сервер нашел в таблице user запись с неправильным паролем и в результате запись просто игнорируется системой привилегий.

П ричины проблемы и способы ее решения могут быть следующими:

Возможно, работает новая версия mysqld со старой таблицей user. Это можно проверить путем выполнения mysqlshow mysql user , чтобы посмотреть, короче ли поле пароля, чем 16 символов. Если это так, то положение можно исправить, запустив сценарий
'scripts/add_long_password'.

У пользователя старый пароль (длиной в 8 символов), а mysqld запущен без опции –old-protocol . Обновите данные пользователя в таблице user, задав новый пароль, или перезапустите mysqld с –old-protocol .

Пароль был установлен в таблице user без применения функции PASSWORD() . Воспользуйтесь mysql для обновления пароля пользователя в таблице user . Позаботьтесь о том, чтобы была использована функция PASSWORD() :

Ошибка Table ‘xxx’ doesn’t exist

П олучение ошибки Table ‘xxx’ doesn’t exist или Can’t find file: ‘xxx’ (errno: 2) , означает, что в текущей базе данных не существует таблицы с именем xxx .

Читайте также:  Энергия и плотность энергии электрического поля

О братите внимание: поскольку в MySQL для хранения баз данных и таблиц используются каталоги и файлы, то имена баз данных и каталогов являются зависимыми от регистра символов! (Под Windows имена баз данных и таблиц не зависят от регистра символов, но для всех ссылок на заданную таблицу в пределах запроса должен использоваться одинаковый регистр!)

П роверить, какие таблицы имеются в текущей базе данных, можно с помощью SHOW TABLES . См. раздел Синтаксис команды SHOW .

Ошибка Can’t initialize character set xxx

П олучение ошибки наподобие:

MySQL Connection Failed: Can’t initialize character set xxx

О значает, что имеется одна из следующих ситуаций:

Кодировка является многобайтовой и не поддерживается клиентом. В этом случае необходимо перекомпилировать клиент с –with-charset=xxx или с –with-extra-charsets=xxx (см. раздел Типичные опции configure ). Весь стандартный бинарный код MySQL откомпилирован с –with-extra-character-sets=complex , что обеспечивает поддержку всех многобайтовых кодировок (см. раздел Набор символов, применяющийся для записи данных и сортировки).

Кодировка является простой кодировкой, не скомпилированной в mysqld , и файлы определения кодировки находятся не там, где рассчитывает их найти клиент. В этом случае необходимо:

Перекомпилировать клиент с поддержкой этой кодировки (см. раздел Типичные опции configure ).

Указать клиенту, где расположены файлы определения кодировки. Для многих клиентов это можно сделать с помощью опции
–character-sets-dir=path-to-charset-dir .

Скопировать файлы определения кодировки туда, где, по мнению клиента, они должны находиться.

Не найден файл (File not found)

П олучение от MySQL ERROR ‘. ‘ not found (errno: 23), Can’t open file: . (errno: 24) , или любой другой ошибки с номером 23 или 24 означает, что для MySQL выделено недостаточно файловых дескрипторов. Можно использовать утилиту perror для получения описания ошибки с определенным номером:

П роблема здесь в том, что mysqld пытается одновременно держать открытыми слишком много файлов. Можно либо указать mysqld не открывать так много файлов одновременно, либо увеличить количество файловых дескрипторов, доступных mysqld .

Ч тобы предписать mysqld держать одновременно открытыми меньше файлов, можно уменьшить табличный кэш, задав safe_mysqld опцию -O table_cache=32 (значение по умолчанию 64). Уменьшение значения max_connections также уменьшит количество открытых файлов (по умолчанию значение переменной 90).

Читайте также:  Приложение quik для андроид что это

Ч тобы изменить число доступных mysqld файловых дескрипторов, можно использовать опцию –open-files-limit=# в safe_mysqld или опцию -O open-files-limit=# в mysqld (cм. раздел SHOW VARIABLES .). Проще всего это сделать путем добавления опции в файл опций (см. раздел 4.1.2 Файлы параметров 'my.cnf'). Если используется ранняя версия mysqld , не поддерживающая эту возможность, можно отредактировать скрипт safe_mysqld . В скрипте есть закомментированная строка ulimit -n 256 ; можно, убрав символ ‘#’ , раскомментировать эту строку и, заменив значение 256 другим, повлиять на количество доступных mysqld файловых дескрипторов.

П ри помощи ulimit (и open-files-limit ) можно увеличить количество файловых дескрипторов только до предела, установленного в операционной системе. Существует также "жесткий" предел, который может быть переопределен только при запуске safe_mysqld или mysqld от имени пользователя root (но помните, что в этом случае также следует использовать опцию –user=. ). Если необходимо увеличить предел ОС по количеству доступных отдельному процессу файловых дескрипторов, обращайтесь к документации по своей операционной системе.

О братите внимание: при использовании tcsh ulimit работать не будет! Кроме того, tcsh будет сообщать неверные значения при запросе текущих пределов! В этом случае необходимо запускать safe_mysqld с использованием sh !

I am trying to execute my PHP code, which calls two MySQL queries via mysqli, and get the error "Commands out of sync; you can’t run this command now".

Here is the code I am using

I have tried reading up on this, but I am unsure of what to do. I have read about store result and free result, however these have made no difference when using them. I am unsure at exactly which point this error is being caused, and would like to know why it is being caused, and how to fix it.

Читайте также:  Ssd mlc 256 gb

Going by my debug statements, the first if loop for countQuery is not even being entered, because of an error in my sql syntax near near ‘% ? %’ . However if I just select * instead of trying to limit based on a LIKE clause, I still get the command out of sync error.

17 Answers 17

You can’t have two simultaneous queries because mysqli uses unbuffered queries by default (for prepared statements; it’s the opposite for vanilla mysql_query ). You can either fetch the first one into an array and loop through that, or tell mysqli to buffer the queries (using $stmt->store_result() ).

See here for details.

I solved this problem in my C application – here’s how I did it:

Quoting from mysql forums:

This error results when you terminate your query with a semicolon delimiter inside the application. While it is required to terminate a query with a semicolon delimiter when executing it from the command line or in the query browser, remove the delimiter from the query inside your application.

After running my query and dealing with the results [C API: mysql_store_result() ], I iterate over any further potentially pending results that occurs via multiple SQL statement execution such as two or more select statements (back to back without dealing with the results).

The fact is that my procedures don’t return multiple results but the database doesn’t know that until I execute: [C API: mysql_next_result() ]. I do this in a loop (for good measure) until it returns non-zero. That’s when the current connection handler knows it’s okay to execute another query (I cache my handlers to minimize connection overhead).

This is the loop I use:

I don’t know PHP but I’m sure it has something similar.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock detector