Вот мой общий взгляд на тему.
При использовании динамических строк SQL вы полагаетесь на корректную работу escape-функции. К сожалению, это не всегда так, как видно из этого (по общему признанию) старого примера:
http://dev.mysql.com/doc/refman/5.0/en/news-5-0-22.html
Как только значения ваших данных будут экранированы, строка SQL должна быть проанализирована и скомпилирована сервером базы данных. Если экранирующая функция не выполнила свою работу должным образом или обнаружена новая хитрая атака с использованием SQL-инъекций, существует вероятность того, что сервер ошибочно примет данные за операторы SQL.
Если вы используете подготовленные операторы с параметрами, оператор сначала анализируется и компилируется. Значения данных объединяются с скомпилированным оператором, когда он выполняется. Это отделяет логику SQL от значений данных - возможность перепутать два , если никогда не произойдет.
Так что, да, вы можете обойтись без mysqli_real_escape_string
, но я бы не сказал, что использование подготовленных операторов с параметрами делает внедрение SQL невозможным. Это значительно усложняет задачу, но, как и в случае с ошибкой mysqli_real_escape_string
, я полагаю, что всегда существует вероятность того, что еще не обнаруженная (или вновь созданная) ошибка сделает на первый взгляд невозможное возможным.