моя особенность "помни меня" - PullRequest
0 голосов
/ 10 января 2010

Наконец-то у меня есть эта функция для работы. Он делает свою работу, но выглядит очень грязно, просто хочу услышать ваши мысли и, может быть, что-то, что я мог бы улучшить?

Большое спасибо!

Логин

$result = mysql_query("SELECT * FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
$row = mysql_fetch_object($result);

    if (mysql_num_rows($result) == 0) {
        exit('Bad Login');
    }

    $_SESSION['id'] = mysql_result($result, 0, 'id');

    # The user wants to be remembered
    if (isset($_POST['remember'])) {
        $key = md5(uniqid());
        setcookie('remember', $key, time()+900000);  /* expire in 10 days */
        mysql_query("UPDATE users SET sessionkey = '$key' WHERE id = ".mysql_result($result, 0, 'id'));

    }

И на каждой странице я проверяю:

if (isset($_SESSION['id'])) {
header("Location: welcome.php");
}

elseif (isset($_COOKIE['remember'])) {

$rs = mysql_query("SELECT * FROM users WHERE sessionkey = '$_COOKIE[remember]'");

if (mysql_num_rows($rs) == 1) {
    $_SESSION['id'] = 1;
header("Location: welcome.php");
}

}

Ответы [ 2 ]

2 голосов
/ 11 января 2010

Поместите код, который проверяет, равно ли число строк нулю перед оператором mysql_fetch_object($result). Таким образом, вы не тратите лишний цикл ЦП, если пользователь не существует.

Изменить это (в обоих местах):

mysql_result($result, 0, 'id');

до

$row->id;

Кроме того, если ваш столбец id не является санитарно-гигиеническим (то есть пользователь в какой-то момент ввел для него некоторые данные), вы захотите избежать его в своем запросе UPDATE.

Это просто вопрос предпочтения, но когда я проверяю наличие параметров URL, мне нравится использовать !empty() вместо isset. Причина в том, что если параметр установлен, но пустой, он все равно вернет false:

!empty($_POST['remember'])

Также на этой ноте обязательно продезинфицируйте $_COOKIE['remember']. Значения cookie могут быть изменены пользователем.

mysql_query("SELECT * FROM users WHERE sessionkey = '" . mysql_real_escape_string($_COOKIE[remember]) . "'");

И, наконец, было бы неплохо не выбирать * в своем запросе, так как это может привести к снижению производительности в дальнейшем в вашем приложении. Попробуйте просто выбрать, скажем, идентификатор пользователя:

mysql_query("SELECT id FROM users ...

Все остальное выглядит довольно хорошо!

0 голосов
/ 10 января 2010

Я не эксперт по PHP, но, вероятно, есть готовое решение для управления сессиями - я бы посоветовал использовать его вместо собственного

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...