Потенциально огромная разница в поведении, если var_name
содержит строку типа
'A' AND 1=2 UNION SELECT password, null, null ... FROM users WHERE username='admin'
. В первом примере вы можете просто манипулировать БД, чтобы сбросить пароль администратора (хэши) или другую конфиденциальную информацию.Если бы это было сделано как переменная связывания, вы бы получили 0 строк, если на самом деле нет сотрудника с именем 'A' AND 1=2 UNION ...
. Первый запрос даже вызовет сбой, если имя вашего сотрудника будет гораздо более безобидным.Peter O'Toole
или что-то еще с допустимым символом
https://bobby -tables.com подробно расскажет о взломе SQL-инъекций
Всегда, всегда, всегда используйтесвязать переменные.Никогда не существует оправдания для конкатенации строк значения в запросе, когда вместо него можно объединить имя переменной вместо
-
Что касаетсяпроизводительность может помочь оптимизатору запросов к базе данных планировать запросы и планы выполнения кэша, если он знает, какие части запроса подвержены изменениям, а какие исправлены.Если вы объединяете значения в, он не может определить разницу между тем, что, как вы заявляете, вы могли бы изменить в следующий раз, и тем, что остается неизменным
SELECT * FROM emp WHERE emp_type = 'manager' and emp_name = :name
Выше оптимизатор может легко сделать вывод, что этот запрос будетвсегда только типы менеджера возврата, хотя имя может отличаться. Это может повлиять на стратегии доступа к данным и индексации и повлиять на производительность.Трудно быть конкретным, потому что оптимизатор - это что-то вроде черного ящика;но будьте уверены, что он стремится обеспечить наилучшую производительность из доступной информации благодаря старому доброму капитализму / рыночным силам (кто покупает медленный дБ?), так что помогите ему ..