Без кавычек представленные пользователем данные будут рассматриваться как ссылки на поля и / или недействительный SQL.
Рассмотрим имя пользователя username
. Правильный запрос будет:
SELECT ... FROM ... WHERE username='username'
и совпадают только в том случае, если действительно существует пользователь с именем «username».
Без кавычек становится:
SELECT ... FROM ... WHERE username=username
, который будет соответствовать ВСЕМ ненулевым записям в таблице.
Теперь рассмотрим имя пользователя, состоящее из двух частей: John doe
SELECT ... FROM ... WHERE username=John doe
Сервер БД попытается сравнить поле имени пользователя с именем поля «Джон», которого, скорее всего, не существует. Кроме того, в нем есть «doe», который не является ни именем поля, ни ключевым словом SQL, так и синтаксической ошибкой.
Теперь рассмотрим имя пользователя: 1 or 1=1
SELECT ... FROM ... WHERE username=1 or 1=1
снова, это ВСЕГДА вернет true и совпадет со ВСЕМИ строками, потому что "1 = 1" всегда будет true.
mysql_real_escape_string () только гарантирует, что любые данные, которые вы передаете через него, не "сломают" ЗАПРАВИЛЬНО КОНСТРУКТИВНЫЙ запрос. Если запрос, в который вы вставляете экранированные данные, НЕ составлен должным образом, все ставки отменены.