#php #mysql
#php #mysql
Вопрос:
if (! isset($_GET['user_id'])) {
$query = "
SELECT
username, first_name, last_name, gender, birthdate, city, state, picture
FROM
mismatch_user
WHERE
user_id = '" . $_SESSION['user_id'] . "'";
}
это код, который я использую для отображения информации для пользователя, вошедшего в систему. как бы я закодировал его, чтобы вы могли просматривать другие профили в том же profile.php сценарий?
Ответ №1:
Я не совсем уверен, в чем проблема. Как насчет следующего запроса?
$query = "SELECT username, first_name, last_name, gender, birthdate, city, state, picture FROM mismatch_user WHERE user_id = '" . mysql_real_escape_string($_GET['user_id']) . "'";
Пожалуйста, обратите также внимание, что ваш код уязвим для атак с использованием SQL-инъекций. Всегда используйте mysql_real_escape_string()
для экранирования пользовательского ввода, отправляемого в базу данных.
Комментарии:
1. вот так if (!isset($_GET[‘user_id’])) { $query = «ВЫБЕРИТЕ имя пользователя, имя, фамилию, пол, дату рождения, город, штат, картинку ИЗ mismatch_user, ГДЕ user_id = ‘» . $_SESSION[‘user_id’] . «‘»; } else{ $query = «ВЫБЕРИТЕ имя пользователя, имя, фамилию, пол, дату рождения, город, штат, картинку ИЗ mismatch_user, ГДЕ user_id = ‘» . $_GET[‘user_id’] . «‘»; }
2. @mattmorris вы не экранируете $_GET[‘user_id’], как предложил Миддус в своем ответе. Это делает ваш код уязвимым для SQL-инъекций, что является серьезной проблемой безопасности, подробнее см. en.wikipedia.org/wiki/SQL_injection .
3. ну, да, но вам нужно убедиться
$_GET['user_id']
, что это целое число или использовать для него mysql_real_escape_string. Это практика, которую я и другие присутствующие здесь не можем достаточно подчеркнуть. Возьмите за привычку всегда следить за тем, чтобы все, что входит в SQL-запрос, экранировалось: php manual on SQL injection
Ответ №2:
Я предполагаю, что $_GET[‘user_id’] будет иметь значение в случае, если вы хотите увидеть профиль другого пользователя, и что, если идентификатор пользователя не указан, должен отображаться профиль вошедшего в систему пользователя:
isset($_GET['user_id']) ?
$user_id = (int) $_GET['user_id'] :
$user_id = $_SESSION['user_id'];
$query = "
SELECT
username, first_name, last_name, gender, birthdate, city, state, picture
FROM
mismatch_user
WHERE
user_id = '" . $user_id . "'";
Приведение к int для назначения $_GET предотвратит внедрение SQL.
Комментарии:
1. Приведение будет работать для целых чисел (я предполагаю, как и вы, что идентификатор будет целым числом), но не для строк. Это то, что нужно иметь в виду.
2. Да, если вы приведете строку к int, значение будет равно 0, если строка не начинается с цифр или пробелов, за которыми следуют цифры, в этих случаях строка будет преобразована в целое число, представленное цифрами в начале строки.