query
выполняет стандартный оператор SQL и требует, чтобы вы правильно экранировали все данные, чтобы избежать инъекций SQL и других проблем.
execute
запускает подготовленный оператор, который позволяет вам связывать параметры, чтобы избежать необходимости экранировать параметры или заключать их в кавычки. execute
также будет работать лучше, если вы повторяете запрос несколько раз. Пример подготовленных заявлений:
$sth = $dbh->prepare('SELECT name, colour, calories FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories);
$sth->bindParam(':colour', $colour);
$sth->execute();
// $calories or $color do not need to be escaped or quoted since the
// data is separated from the query
Лучшая практика - придерживаться подготовленных операторов и execute
для повышения безопасности .
См. Также: Достаточно ли подготовленных операторов PDO для предотвращения внедрения SQL?
: calories
препарат, это эквивалентmysql_real_escape_string()
остановки инъекций, или вам нужно больше, чем просто$sth->bindParam(':calories', $calories);
для повышения безопасности?query
возвращает PDOStatement , вместо BOOL , какexecute
?Нет, они не такие. Помимо экранирования на стороне клиента, который он предоставляет, подготовленный оператор компилируется на стороне сервера один раз, а затем может передавать различные параметры при каждом выполнении. Это означает, что вы можете:
Обычно они улучшают производительность, хотя и незаметно в небольших масштабах. Подробнее о подготовленных операторах (версия MySQL) .
источник
Ответ Гилеан великолепен, но я просто хотел добавить, что иногда бывают редкие исключения из лучших практик, и вы можете протестировать свою среду в обоих направлениях, чтобы увидеть, что будет работать лучше всего.
В одном случае я обнаружил, что это
query
работало быстрее для моих целей, потому что я массово передавал доверенные данные из системы Ubuntu Linux, работающей под управлением PHP7 с плохо поддерживаемым драйвером Microsoft ODBC для MS SQL Server .Я пришел к этому вопросу, потому что у меня был давно работающий скрипт для ETL, который я пытался сжать для скорости. Мне казалось интуитивно понятным, что
query
может быть быстрее, чемprepare
&,execute
потому что он вызывает только одну функцию вместо двух. Операция привязки параметров обеспечивает отличную защиту, но может быть дорогостоящей и ее можно избежать, если в ней нет необходимости.Учитывая пару редких условий :
Если вы не можете повторно использовать подготовленный оператор, потому что он не поддерживается драйвером Microsoft ODBC .
Если вы не беспокоитесь о дезинфекции ввода, допустимо простое экранирование. Это может быть связано с тем, что привязка определенных типов данных не поддерживается драйвером Microsoft ODBC .
PDO::lastInsertId
не поддерживается драйвером Microsoft ODBC.Вот метод, который я использовал для тестирования своей среды, и, надеюсь, вы сможете воспроизвести его или что-то получше в своей:
Для начала я создал базовую таблицу в Microsoft SQL Server.
А теперь простой временной тест для показателей производительности.
Я играл с несколькими различными испытаниями и счетчиками в моей конкретной среде и постоянно получаю на 20-30% быстрее результаты с
query
чемprepare
/execute
Мне любопытно посмотреть, как этот тест сравнивается в других средах, таких как MySQL.
источник