PHP / mysqli-подготовленный оператор (в цикле) или мульти-запрос

Я только что перешел от использования mysql к расширению mysqli в PHP.

я столкнулся с двумя способами сделать то же самое (несколько запросов обновления), каковы плюсы/минусы каждого? Должен ли я использовать один или другой или что-то еще полностью?

подготовленное заявление в цикле:

//prepare statement
foreach(whatever){
  //execute statement
}

или

мульти-запроса:

foreach(whatever){
  //build many queries into a single string
}
multi_query(long string)

Я знаю, что подготовленные операторы обеспечивают лучшую защиту. При использовании mysql в PHP я слышал его лучше чтобы избежать использования инструкций UPDATE в цикле - не выполняет ли mysqli подготовленный оператор в цикле то же самое по другому имени?

3 ответов


если по какой-то причине вы не можете обновить все целевые записи только одним оператором обновления mysql, чтобы избежать необходимости в этом цикле PHP в целом, это прекрасно повторное использование этого же update объект оператора mysqli в цикле.

стиль и ресурс мудрый, повторное использование параметризованного оператора лучше, чем постоянно воссоздавать его. Используя его, все, что вы делаете после первого bind_param вызов повторно присваивает значение связанных переменных PHP на каждом итерация, затем просто re -executing (см.: mysqli_stmt->execute Пример #1 объектно-ориентированный стиль).

помните, в вашей WHERE предложение, у вас просто будет другой параметр, назначенный переменной PHP, такой как WHERE (recordID = ?) для перебора.

для первоначальной настройки каждого параметризованного оператора требуются дополнительные ресурсы, поэтому несколько параметризованных операторов должны быть зарезервированы для передачи в multiple связаны заявления или запросы. Кроме того, это делает не похоже, что PHP multi queries функции и методы поддерживают параметризацию вообще в любом случае.


две другие ответы не устраните фактические различия между несколькими запросами и подготовленными инструкциями - они совершенно разные.

  • подготовленные заявления-вы создаете шаблон заявления после затем выполните его несколько раз с разными значениями, используемыми для каждого шаблона (используя bind_param). Существует сервер туда и обратно для настройки оператора и одно туда и обратно в запрос. Он использует двоичный файл MySQL протокол для отправки данных, поэтому он фактически будет отправлять меньше данных через строки, чем обычный запрос.

  • Multi-query-это просто выполнение нескольких обычных запросов MySQL сразу. Есть один сервер туда и обратно для всего мульти-запроса. Это почти определенно обеспечивает лучшую производительность по сравнению с подготовленными инструкциями (если ваш запрос не является аномально гигантским, а изменяющиеся значения малы).

поэтому я бы рекомендую мульти-запрос на скорость. Его не менее безопасно, если вы правильно избегаете своих данных с mysqli:: real_escape_string. Еще одно преимущество multi-query заключается в том, что вы можете выполнять совершенно разные запросы в одном запросе, в то время как подготовленные операторы полагаются на симметрию запроса для получения любого преимущества.


Боб-разрушитель прав (лучше использовать подготовленные заявления). Я просто хотел кое-что добавить.

  1. выполнения $mysqli->multi_query($sql) после того, как цикл эквивалентен execute $mysqli->query($sql) каждый раз внутри цикла. Разница между multi_query и просто query это query не принимает более 1 запроса, разделенных точкой с запятой. multi_query действительно затрудняет проверку ошибок во втором и последующих запросах выполненный.

  2. Я не знаю, почему кто-то избегает выпуска обновлений внутри цикла. Но лучше всего обернуть цикл в транзакцию, чтобы при сбое любого запроса вы могли откатить все обновления.