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

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

  string regex = string.Format ("[{0}]", Regex.Escape (новая строка (Path.GetInvalidFileNameChars ())));  Regex removeInvalidChars = new Regex (regex, RegexOptions.Singleline | RegexOptions.Compiled | RegexOptions.CultureInvariant);   

Затем я просто вызываю removeInvalidChars.Replace, чтобы найти и заменить. Это, очевидно, может быть расширено и для покрытия дорожек.

80
задан Peter O. 23 October 2012 в 14:01
поделиться

12 ответов

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

См. здесь для деталей.

96
ответ дан HoLyVieR 15 August 2018 в 17:54
поделиться
  • 1
    Я согласен, mysqli немного поврежден мозгом. Тем не менее, делает правильную работу с драйвером mysql PDO. – user 5 March 2009 в 14:59
  • 2
    У вас может есть два одновременных запроса - вам просто нужно запустить $stmt->store_result();. Думаю, ваш ответ должен сделать это более ясным. – Shadow 14 March 2013 в 09:24
  • 3
    Принимая во внимание возраст, чтобы найти эту информацию - нет, где она легко отображается. Благодарю. Я просто разделяю свои запросы с помощью $select_stmt->close();, чтобы разделить их (не одновременно, а процедурно – n34_panda 7 June 2014 в 12:13
  • 4
    @flussence, Вы заявили, что «mysqli использует небуферизованные запросы по умолчанию». Итак, как мы можем заставить его действовать иначе? – Pacerier 29 June 2015 в 08:34
  • 5
    Вы можете создать 2 одновременных соединения и небуферизованный подготовленный оператор для каждого без получения ошибки синхронизации. – alfadog67 6 December 2016 в 22:50

Для тех, что предыдущие ответы не помогли ... вот что было МОЙ ПРОБЛЕМ !!!

привязка param была «динамической», поэтому у меня была переменная, которая задает параметры данных для использования bind_param. Так что переменная была неправильной, но вместо того, чтобы бросать ошибку, например, «неверные данные параметров», она говорит «вне синхронизации bla bla bla», поэтому я был смущен ...

Надеюсь, это помогло кому-то!

0
ответ дан AriWais 15 August 2018 в 17:54
поделиться

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

$this->db->reconnect();

Исправлено.

2
ответ дан j0k 15 August 2018 в 17:54
поделиться
  • 1
    Как это относится к проблеме? – Jeremy J Starcher 22 September 2012 в 08:06
  • 2
    @Norman, это не исправление & quot; проблема. Это просто позволяет избежать , удалив все соединение и снова подключившись. Это не имеет никакого смысла с точки зрения производительности. – Pacerier 30 June 2015 в 04:27

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

function clearStoredResults(){
    global $mysqli;

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

}
6
ответ дан Juergen 15 August 2018 в 17:54
поделиться
  • 1
    Просто использовал свой ответ, чтобы решить проблему, которую я испытываю. Спасибо, что предоставили его. – Brent 2 December 2016 в 04:48
  • 2
    спасибо, он спас мой день. – Dhaval Bhimani 21 July 2018 в 16:04

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

$numRecords->execute();

$numRecords->store_result();

, это все

1
ответ дан Lucas Zamboulis 15 August 2018 в 17:54
поделиться

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

while($this->mysql->more_results()){
    $this->mysql->next_result();
    $this->mysql->use_result();
}
13
ответ дан Machavity 15 August 2018 в 17:54
поделиться
  • 1
    Это важный момент: хранимые процедуры возвращают набор результатов поверх любого результата, который может генерировать код в SP. Вы должны обработать это или получить эту ошибку: stackoverflow.com/a/2315229/4495850 – Richard 26 June 2016 в 16:53

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

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

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

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

0
ответ дан mech 15 August 2018 в 17:54
поделиться

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

0
ответ дан Mixtelf 15 August 2018 в 17:54
поделиться

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

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

0
ответ дан Paul Tomblin 15 August 2018 в 17:54
поделиться
  • 1
    Если я сделаю $ con global (что плохой практикой, но должно работать, как вы описали), я все равно имею ту же ошибку. – user 5 March 2009 в 14:19

Если вы используете либо буферный, либо небуферизованный результирующий набор для извлечения данных, сначала вы должны просто очистить извлеченные данные из памяти, после того, как вы извлекли все данные . Поскольку вы не можете выполнить другую процедуру MYSQL в том же соединении, пока вы не очистите извлеченную память. Добавьте эту функцию ниже справа от своего скрипта, чтобы решить проблему

$numRecords->close(); or $numRecords->free(); // This clears the referencing memory, and will be ready for the next MYSQL fetch

Ссылка из документации PHP

0
ответ дан Sara Robert 15 August 2018 в 17:54
поделиться
  • 1
    Если вам не нужны какие-то записи, тогда вы не должны были выбирать их в первую очередь. Вместо того, чтобы просто освобождать их, просто не выбирайте их вообще. И если это не так, и вы выбрали все выбранные записи, то такой ошибки вообще не будет, так что нет необходимости вызывать close () или free (). Что касается хранимых процедур, существует менее варварский метод, описанный в ответах выше – Your Common Sense 5 March 2018 в 09:26

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

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

1
ответ дан staticsan 15 August 2018 в 17:54
поделиться
  • 1
    Мне не нужно, чтобы оба выполнялись сразу, я счастлив, что countQuery закончен полностью до моего второго запроса, но я не уверен, как остановить countQuery от того, чтобы быть в proggress – user 6 March 2009 в 10:24
  • 2
    Вы не извлекаете данные из countQuery, поэтому он все еще «находится в процессе». Либо загрузите все строки, либо измените их на SELECT COUNT (ARTICLE_NO) и получите эту строку. Тогда ваш второй запрос будет запущен. – staticsan 8 March 2009 в 22:45
  • 3
    Когда вы говорите «асинхронный MySQL API», на какой API вы ссылаетесь? Кроме того, я не понимаю, что вы делаете. Эта "проблема" могут быть исправлены без использования API для асинхронности. – Pacerier 30 June 2015 в 04:21
  • 4
    Если честно, @Pacerier, я не уверен, что я имею в виду то же самое! За шесть лет существования MySQL подключилось много, так что, как я думал, я имел в виду, вероятно, был переименован и / или включен в какой-то другой новый драйвер. – staticsan 30 June 2015 в 07:44

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

  1. Цитата из форумов mysql: Эта ошибка возникает, когда вы завершаете свой запрос разделителем с запятой внутри применение . Хотя для завершения запроса с разделителем с запятой при выполнении его из командной строки или в браузере запроса удалите разделитель из запроса внутри приложения.
  2. После выполнения моего запроса и обработки результатов [C API: mysql_store_result()], я перебираю любые дальнейшие потенциально ожидающие результаты, возникающие при выполнении нескольких операторов SQL, таких как два или более оператора select (назад назад, не имея дело с результатами). Дело в том, что мои процедуры не возвращают несколько результатов, но база данных не знает, что до выполнения: [C API: mysql_next_result()]. Я делаю это в цикле (для хорошей меры), пока не вернет ненулевое значение. Вот когда текущий обработчик подключений знает, что можно выполнить другой запрос (я кэширую свои обработчики, чтобы минимизировать накладные расходы на соединение). Это цикл, который я использую:
    for(; mysql_next_result(mysql_handler) == 0;) 
      /* do nothing */;
    

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

25
ответ дан tracy.brown 15 August 2018 в 17:54
поделиться
  • 1
    Это было для меня. В PHP я просто добавил: while (mysqli_next_result ($ con)); – Josh 24 April 2012 в 01:02
  • 2
    Спасибо за ответ, который решил мою проблему. Я удалил разделитель, и он работает. Я не освобождал (извлекал) или не сохранял свои результаты, но закрывал курсор и повторно строил, как только я закончил один оператор запроса. – Chen Xie 13 October 2012 в 00:19
  • 3
    @Josh, Как это сделать в наследстве mysql? – Pacerier 20 April 2015 в 11:26
  • 4
    Удаление точки с запятой в конце запроса фиксировало «Команды не синхронизированы»; вы не можете запустить эту команду сейчас & quot; проблема при использовании Python MySQLdb. – Genome 16 February 2018 в 04:48
Другие вопросы по тегам:

Похожие вопросы: