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