Отображение пользовательского содержимого

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