#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) для обеспечения правильного экранирования любых значений нелитеральных переменных.