Мой скрипт выполняет с помощью multi_query() до несколько сотен объединенных запросов UPDATE или INSERT, но это асинхронных запрос, а мне нужно дождаться когда все запросы будут выполнены, прежде чем продолжить выполнение скрипта.
p.s. я неправильно выразился про асинхронный, имел ввиду скрипт отправляет запрос и продолжает работу не дожидаясь их исполнения. Например, я отправляю в базу на добавление 300 строк, php уже прислал ответ, но в это время еще идет добавление в базу. А мне нужно продолжить работу, только когда все строки будут добавлены
Есть нормальный синхронный функционал выполнения запросов по одному. Помимо прочего - ещё и безопасный, если использовать подготовленные выражения.
Но мы по какой то причине не ищем лёгких путей, и вместо того чтобы сразу выполнять сформированный запрос, зачем-то вместо этого добавляем его в длинную строку, потом выполняем через мульти квери и потом мучается вопросом, как узнать результат.
То есть вместо стандартного подхода мы усложняем код, чтобы в итоге получить проблему. Я искренне не понимаю, какой в этом смысл
DmitryUlitin, это хороший пример той ерунды, которую часто пишут в интернете.
Объединение запросов в оди не дает ничего, кроме головной боли.
Единственный случай, когда имеет смысл выполнять запросы пачкой - это если у нас уже есть готовый дамп из кучи запросов. А если запросы формируются на лету, то их надо сразу и исполнять. Применение подготовленных запросов будет быстрее, чем склейка в 1.
Для правильного вопроса надо знать половину ответа
С чего вы взяли, что multi_query - это асинхронный запрос? PHP вообще асинхронно не работает. Если у вас используется какая-то своя библиотека, то ответ надо искать в её доках.
я неправильно выразился, имел ввиду скрипт отправляет запрос и продолжает работу не дожидаясь их исполнения. Например, я отправляю в базу на добавление 300 строк, php уже прислал ответ, но в это время еще идет добавление в базу. А мне нужно продолжить работу, только когда все строки будут добавлены
DmitryUlitin, Возврат из multi_query происходит только после выполнения всех запросов. Асинхронно может работать только обычный query с библиотекой mysqlnd, если в вызове функции установлен соответствующий флаг.
Вы уверены, что ваша multi_query это именно mysqli::multi_query, а не самописная функция?
Rsa97, ну как бы да. Я тоже в свое время удивился, поскольку это явно, вроде бы, нигде не прописано. В итоге чтобы получить результаты выполнения всех запросов надо прикручивать цикл для их получения, как для хранимых процедур, и в итоге код становится совсем уже монструозным.
Но на самом деле это не имеет никакого значения, асинхронный или нет. ПДО например, ждет выполнения всех, но проблема остается та же самая.
Что на самом деле важно - это что multi_query возвращает результат только первого запроса. А нам нужно получить все.
FanatPHP, То, что возвращается только результат первого запросе, не означает, что функция работает асинхронно. Вопрос в том, когда из функции возвращается управление скрипту.
И то, что нужно делать перебор результатов, тоже не добавляет асинхронности, просто такая неудачная реализация. Можно было и сразу массив ответов вернуть.
Если посмотреть функции more_results и next_result, то в их описании тоже нет ошибки "Ответ ещё не готов" или "Запрос ещё не выполнен".
Вот не понимаю я такого упрямства на пустом месте. Зачем скатываться в это вот "А я все равно докажу, что прав, не на практике, конечно, а надергав цитат из интернета".
Ну как знаешь