У меня есть массив строк, которые являются 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();
Чтобы выяснить, почему ваш код не работает, я бы посоветовал взглянуть на полную строку $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
Смотрите мою презентацию Быстрая загрузка данных! для сравнения производительности.
Других решений пока нет …