INSERT в mysqli_multi_query

163
11 декабря 2019, 03:30

Предположим есть запрос

INSERT INTO writer_disciplines_temp(wrd_id,wrt_id)
  SELECT min(id) as wrd_id, wrt_id
  FROM `writer_disciplines`
  WHERE wrt_id = 191000
  GROUP BY discipline_id;
INSERT INTO writer_disciplines_temp(wrd_id,wrt_id)
  SELECT min(id) as wrd_id, wrt_id
  FROM `writer_disciplines`
  WHERE wrt_id = 191000
  GROUP BY discipline_id; 

Только INSERT-ов на самом деле, допусти 1000.

Для выполнения используется метод

public function multiQuery($query_text)
    {
        $return = [];
        $query = mysqli_multi_query($this->getConnection(), $query_text);
        if ($query) {
            do {
                if ($result = mysqli_store_result($this->getConnection())) {
                    while ($row = mysqli_fetch_row($result)) {
                        $return[] = $row;
                    }
                    mysqli_free_result($result);
                }
            } while (mysqli_more_results($this->getConnection()) && mysqli_next_result($this->getConnection()));
        }
        if (mysqli_error($this->getConnection())) {
            die(mysqli_error($this->getConnection()));
        }
        return $return;
    }

После INSERT-a сразу выполняется другая операция с нашей таблицей.

Нужно чтобы след команды выполнялись после всех insertoв в multiQuery($sql).($sql указан выше).

Решение найти не смог в рамках использования такого запроса и mysqli_multi_query. Изменил процесс работы, всё ок. Но, думаю, полезно будет разобраться.

Answer 1

Я думаю, что проблема в $this->getConnection(). Если каждый раз открывается новое соединение, то вся последующая обработка не работает. Соответственно, результаты работы всех инсертов мы не получаем. И в результате последующие команды исполняются до того как все запросы на вставку успеют завершиться

В любом случае следует понимать, что mysqli_multi_query - это очень сложный инструмент, с которым надо уметь обращаться. И без нужды не применять. Так что текущее измененное решение без mysqli_multi_query это самый оптимальный вариант.

READ ALSO
Как правильно прописать путь к серверу для отправки сокета

Как правильно прописать путь к серверу для отправки сокета

Я делаю чат на сайте, и для этого у меня есть сервер или дежурный скрипт, который принимает сообщения и отправляет сообщения клиенту

153
htaccess в двух сайтах

htaccess в двух сайтах

знатакиЕсть проблема с сайтами, два сайта в одному выходит, один основной и второй залит в папку в нём же, но проблема состоит в том, что htaccess...

146
SIGSEGV в дестукторе вектора при некорректном смещении итератора

SIGSEGV в дестукторе вектора при некорректном смещении итератора

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

155
Отправка GET/POST-запроса средствами чистого C++

Отправка GET/POST-запроса средствами чистого C++

Как реализовать простой GET/POST запрос без использования сторонних библиотек?

124