Переменная $_SESSION в запросе mysql?

#php #mysql

#php #mysql

Вопрос:

Всякий раз, когда я пытаюсь выполнить запрос типа:

 mysql_query("SELECT * FROM data WHERE `user`=$_SESSION['valid_user'] LIMIT 1");
  

это не работает. Почему? Я экранировал переменную, затем попробовал без нее и попытался заключить переменную в кавычки. Я знаю, что могу сделать:

 $user = $_SESSION['valid_user'];
  

но разве это не должно работать без? Спасибо.

ОТВЕТ:

PHP не может распознать $_SESSION[‘valid_user’] из-за одинарных кавычек. Поэтому либо используйте фигурные скобки {}, либо возьмите наши одинарные кавычки.

Всем спасибо за помощь.

Комментарии:

1. спасибо за исправление моего кода Quassnoi, мой телефон не позволяет мне этого делать. 😉

Ответ №1:

PHP не может распознать переменные внутри строки, которые имеют квадратные скобки и так далее, вы должны заключить ее в фигурные скобки, чтобы заставить ее распознать.

 mysql_query("SELECT * FROM data WHERE user={$_SESSION['valid_user']} LIMIT 1");
  

Однако — Вы всегда должны избегать любых данных, поступающих в SQL-запрос, попробуйте приведенный ниже пример.

 $validUser = mysql_real_escape_string($_SESSION['valid_user']);
mysql_query("SELECT * FROM data WHERE user='$validUser' LIMIT 1");
  

Комментарии:

1. 1 за пункт о внедрении SQL. Данные сеанса могут быть безопаснее (т. Е. я могу быть достаточно уверен, что valid_user равен либо 0, либо 1), но это все еще хорошая практика.

2. Спасибо :). Да, определенно, и экранирование может помочь предотвратить ошибки, когда переменная содержит кавычки (законным, не злонамеренным способом)

3. Первое предложение неверно. Это прекрасно работает без фигурных скобок, если только вы используете правильный синтаксис: "$_SESSION[valid_user]" в двойных кавычках. (Фигурные скобки требуются только для выражений var .)

Ответ №2:

Массивы / объекты должны включаться в строки немного по-другому:

 mysql_query("SELECT * FROM data WHERE `user`={$_SESSION['valid_user']} LIMIT 1");
  

или вы можете удалить строку и объединить ее в:

 mysql_query("SELECT * FROM data WHERE `user`=" . $_SESSION['valid_user'] . " LIMIT 1");
  

Комментарии:

1. теперь он говорит- предоставленный аргумент не является допустимым ресурсом … wtf? мой веб-хостинггей;(

2. Я подозреваю, что у вашего веб-хостинга нет какой-либо сексуальной ориентации.

3. или просто сделайте «ВЫБРАТЬ …. $_SESSION[valid_user] …» без внутренних одинарных кавычек.

Ответ №3:

То же самое, но с PDO и связанными параметрами

 $stmt = $pdo->prepare('SELECT * FROM data WHERE `user`=:user LIMIT 1');
$stmt->execute(array(':user'=>$_SESSION['valid_user']));
$row = $stmt->fetch();
  

Примечание: вы не можете превратить LIMIT 1 в связанный параметр, потому что LIMIT не является частью стандартного sql, и у PDO есть проблемы с ним, поэтому он должен быть привязан следующим образом

 $stmt = $pdo->prepare('SELECT * FROM data WHERE `user`=:user LIMIT :limit');
$limit = 1;
$user = $_SESSION['valid_user'];
$stmt->bindParam(':user', $user, PDO::PARAM_STR);
$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);
$stmt->execute();
$row = $stmt->fetch();
  

или вот так

 $limit = 1;
$stmt = $pdo->prepare('SELECT * FROM data WHERE `user`=:user LIMIT '.(int)$limit);
$stmt->execute(array(':user'=>$_SESSION['valid_user']));
$row = $stmt->fetch();
  

именно так меня учили это делать, поэтому я хотел указать на это

Ответ №4:

попробуйте это:

 mysql_query("SELECT * FROM data WHERE `user`={$_SESSION['valid_user']} LIMIT 1");
  

также не забудьте поставить session_start вверху страницы

Ответ №5:

ваш массив в этом контексте является просто частью строки и ничем больше. Чтобы пометить выражение как то, что оно есть, вы должны использовать его фигурно 😉 работает только со строками, заключенными в двойные кавычки.

 mysql_query("SELECT * FROM data WHERE user={$_SESSION['valid_user']} LIMIT 1");
  

Ответ №6:

Вам нужно использовать оператор конкатенации строк '.' до и после переменной.

 mysql_query("SELECT * FROM data WHERE `user`=".$_SESSION['valid_user']." LIMIT 1");
  

Поскольку вы используете строку в двойных кавычках, вы также можете использовать {} вокруг переменной вместо конкатенации строк:

 mysql_query("SELECT * FROM data WHERE `user`={$_SESSION['valid_user']} LIMIT 1");
  

Кстати, вам, вероятно, следует заглянуть в mysqli (http://php.net/manual/en/book.mysqli.php ) библиотека, и использовать mysqli::real_escape_string (http://www.php.net/manual/en/mysqli.real-escape-string.php) для обеспечения правильного экранирования любых значений нелитеральных переменных.