FanatPHP: Prepared_statements не единственный способ. Никто не мешает использовать специализированные функции именно для экранирования (те же mysqli_real_escape($str) и им подобные) и не забывать о типах подставляемых данных (а помнить о них нужно и при prepared_statements).
@ash_1 php.net + dev.mysql.com
Но они не нужны, т. к. достаточно понимать, что происходит в строке $query_cities = ... Да-да, PHP и MySQL не знают, что вы подставляете данные, для них у вас с одной стороны просто конкатенация строк, с другой — просто запрос, который получился в итоге. Так что никто не помешает мне в качестве названия города ввести часть запроса, и если вы не обрабатываете такую ситуацию (путем экранирования), то и получите не автокомплит, а интерфейс по творению с БД чего угодно.
Любая функция, какая вам больше нравится, которая будет экранировать пользовательский ввод. Вы ведь не хотите позволить пользователю изменять запрос целиком и добавить в него какой нибудь DROP TABLE cities? :-)
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.