Почему в SQL запросе значение передаваемое в WHERE интерпретируется как название колонки?

Есть пользователь с логином dude. Хочу получить его id из БД SQL-запросом:

$result = $pdo->query("SELECT id FROM users WHERE login=" . $_SESSION["login"]);

Выдаются ошибки:
Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dude' in 'where clause'

PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'dude' in 'where clause'

Вопрос: что не так и как это исправить?


Ответы (2 шт):

Автор решения: Герман Борисов

Почему в SQL запросе значение передаваемое в WHERE интерпретируется как название колонки?

Потому, что в SQL в принципе в выражении любой токен, не являющийся корректным литералом, переменной или функцией воспринимается как имя столбца.

Строковые литералы должны быть заключены в кавычки.

как это исправить?

Обернуть в кавычки.

Чтобы не морочиться с экранированием внутренних кавычек и не запоминать в каких СУБД какие кавычки есть специальная функция PDO::quote

$result = $pdo->query("SELECT id FROM users WHERE login=" . $pdo->quote($_SESSION["login"]));
→ Ссылка
Автор решения: Improbus42

Можно переменную $_SESSION["login"] засунуть в переменную $seslog и в sql запросе в кавычки заключить эту переменную: $seslog = $_SESSION["login"]; $result = $pdo->query("SELECT id FROM users WHERE login= '$seslog'"); Должно все сработать, а если такого логина нет, то просто пустота будет, без ошибок.

→ Ссылка