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