2017-02-01 5 views
0

Я пытаюсь удалить запущенные запросы MySQL для циклов внутри некоторого кода.Выполнение запросов в цикле for

Но я не уверен, как лучше всего это достичь.

с использованием PHP PDO с именованными параметрами, как хранить запросы, а затем запускать их как пакет после цикла? так что единственное, что происходит в цикле for, - это создание запросов, но не выполнение до тех пор, пока цикл не завершится?

вот пример кода:

for($i=$rowcount; $i>0; $i--){ 
    $id = $array[$i]; 
    $query = "DELETE FROM table WHERE ID=:id AND Order=:order"; 
    $stmt = $conn->prepare($query); 
    $stmt->execute(array('id' => $id, 'order' => $i)); 
} 
+1

Я бы рекомендовал: -http: //stackoverflow.com/a/4639672/4248328. даже это также может применяться для подачи заявления –

+0

- ваш идентификатор уникален или нет? –

+0

Нет, может быть много строк с этим полем id –

ответ

0

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

$conn->beginTransaction(); 
try{ 
    $query = "DELETE FROM table WHERE ID=:id AND Order=:order"; 
    $stmt = $conn->prepare($query); 

    for($i=$rowcount;$i>0;$i--){ 
     $id = $array[$i]; 
     $stmt->execute(['id' => $id,'order'=>$i]); 
    } 

    $conn->commit(); 
} 
catch(Exception $ex){ 
    $conn->rollBack(); 
} 
+1

Подготовьте инструкцию до цикла, это будет хорошей идеей. – Sven

2

Моя первая реакция будет: Почему сделай это? Какова ваша мотивация? Просто избегая SQL-циклов или у вас есть какие-то операционные проблемы, которых вы хотите избежать?

Ваш точный запрос не так просто преобразовать в один запрос, потому что у вас есть кортежи ID и Order значения, которые должны совпадать, чтобы их можно было удалить. Также обратите внимание, что подготовленные заявления обычно не принимают произвольное количество параметров, поэтому даже если вы сможете преобразовать свой запрос в форму DELETE FROM table WHERE (ID=1 AND Order=1000) OR (ID=4 AND Order=1234)..., вам нужно как-то понять, как заполнить первую, вторую, третью. .. местозахват. Кроме того, вы вынуждены генерировать этот подготовленный оператор динамически, что, вероятно, противоречит тому, как должны быть подготовлены инструкции, когда дело касается безопасности.

Если у вас проблемы с производительностью, так как удаление 1000 записей один за другим имеет большое влияние, есть альтернативы: если вы завершаете удаление внутри одной транзакции, то, вероятно, не имеет значения, сколько записей вы удаляете - ВСЕ из них будут удалены после совершения транзакции. Также обратите внимание, что использование подготовленных операторов является одним из способов ускорить операции с базой данных - но только если вы подготовите их только один раз перед циклом, и внутри цикла вы будете снова и снова передавать новые параметры.

Итак, чтобы обернуть это: Отмена SQL в цикле - это не лучшая вещь, если проблема программирования, которую вы хотите решить, лучше решить с помощью цикла, и нет никакой другой проблемы, связанной с ней. Если, однако, есть такая проблема, ее нужно проанализировать и упомянуть - удаление петель - это не автоматическая история успеха.

+0

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

+0

Более эффективный? Да. Предотвратить расплавление под нагрузкой, гарантировано? Нет. Обратите внимание, что вы, в некотором роде, делаете преждевременную оптимизацию. Вы боитесь, что база данных станет узким местом, поэтому вы попытаетесь удалить наиболее очевидную проблему в своем коде. Что, если петли не проблема? Что делать, если после удаления всех циклов база данных все равно расплавится из-за недостаточных индексов? Что, если что-то совсем другое расплавится? Проверяли ли вы код перед тем, как начать оптимизацию? Даже самый нереалистичный сценарий загрузки даст вам подсказки, с чего начать. – Sven

 Смежные вопросы

  • Нет связанных вопросов^_^