PHP / mysqli - подготовленный оператор (в цикле) или multi_query - PullRequest
6 голосов
/ 22 февраля 2011

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

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

Подготовленный оператор в цикле:

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

или

Multi-запрос:

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

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

Ответы [ 3 ]

8 голосов
/ 22 февраля 2011

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

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

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

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

7 голосов
/ 14 февраля 2012

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

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

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

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

0 голосов
/ 22 февраля 2011

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

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

  2. Я не знаю, почему кто-то мог бы избегать выдачи ОБНОВЛЕНИЙ внутри цикла. Но лучше всего обернуть цикл в транзакции, поэтому в случае сбоя любого запроса вы можете откатить все обновления.

...