mysql — php mysqli / multi_query не может быть выполнен более одного раза

У меня есть массив строк, которые являются sql «вход в …» запросов. Я перебираю этот массив, объединяя каждые 50 из них в новую строку, а затем отправляю в базу данных mysql. После этого я сбрасываю свою временную строку и готовлю ее к новым запросам.

Но мой массив останавливается после первого запроса и не хочет отправлять все, поэтому на сервере БД у меня всегда есть только 50 записей. Как я могу исправить свой код и отправить все?

код:

$data // array with sql queries
$queryPartial = ''; // additional string for 50 queries to send

foreach ($data as $index => $queryToSend) {

$queryPartial .= $queryToSend;

// send partials query
if($index % 50 == 0)
{

if($connection->multi_query($queryPartial))
{
$this->output->writeln('succesfull query number: '.$index);
}
$queryPartial = ''; // clean string for next queries
}}
//send the rest of the remaining queries
if($queryPartial !== ''){

if($connection->multi_query($queryPartial))
{
$this->output->writeln('rest of the queries sended');
}
}

$connection->close();

2

Решение

Чтобы выяснить, почему ваш код не работает, я бы посоветовал взглянуть на полную строку $queryPartial прежде чем отправить его как запрос. Бьюсь об заклад, есть синтаксическая ошибка, потому что вы не разделяете операторы с ; или что-то типа того.

Глядя на сам запрос, а не на ваш код, вероятно, станет яснее, где ошибка.

Вам также следует проверить состояние ошибки, возвращаемое функциями mysqli. Возврат большинства функций mysqli ЛОЖНЫЙ если происходит ошибка, и вы должны проверить $connection->error для сообщения об ошибке. Если вы этого не сделаете, могут возникнуть ошибки, но вы никогда не узнаете.

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

Но стоимость совершения звонка мала по сравнению со стоимостью транзакций, которые вставляют данные. Там практически нет пользы от использования multi_query(),

Следующий код делает то же самое, имеет практически одинаковую производительность, гораздо более простой код:

foreach ($data as $index => $queryToSend) {
$result = $connection->query($queryToSend);
if ($result === false) {
error_log("SQL: $queryToSend ERROR: {$connection->error}");
}
}

(всегда проверяйте состояние ошибки, возвращаемое функциями mysqli!)

Если вы пытаетесь ускорить производительность массовых вставок, используя multi_query() имеет незначительное преимущество по сравнению с другими оптимизациями:

  • Объедините несколько строк в один INSERT заявление
  • Объедините несколько выписок в одну транзакцию
  • использование LOAD DATA INFILE вместо INSERT

Смотрите мою презентацию Быстрая загрузка данных! для сравнения производительности.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]