Mysqli работает с несколькими таблицами - PullRequest
1 голос
/ 16 ноября 2011

Мой полный код выглядит так.Как видите, я использовал 2-3 запроса для 1 процесса входа.Я буду рад, если вы поможете мне оптимизировать процесс (возможно, количество запросов можно будет уменьшить):

foreach ($_POST as $k => $v)
    $$k = $v;

$stmt = $db->prepare("SELECT u.id, u.fname, u.lname, u.mname, u.level, u.pass, u.salt, u.approved, u.ban, u2.logged_in FROM `users` AS u, `ulog` AS u2 WHERE u.email=? AND u2.user_id=u.id") or die($db->error);
$stmt->bind_param("s", $email) or die($stmt->error);
$stmt->execute() or die($stmt->error);
$stmt->store_result();
if ($stmt->num_rows > 0) {
    $stmt->bind_result($id, $fname, $lname, $mname, $level, $db_pass, $salt, $approved, $ban, $logged_in) or die($stmt->error);
    $stmt->fetch() or die($stmt->error);
    if ($logged_in == 0) {
        $fullname = $lname . ' ' . $fname . ' ' . $mname;
        $stmt->close();
        if ($approved == 1) {
            if ($ban == 0) {
                $hash = hash('sha256', $salt . hash('sha256', $pass));
                if ($hash == $db_pass) {
                    $ip = ip2long($ip);
                    if (isset($rememmber) && $rememmber == "on") {
                        $ckey = GenKey();
                        $stmt = $db->prepare("INSERT INTO `ulog` (`user_id`, `signin_time`,`ip`, `logged_in`, `ckey`, `ctime`) VALUES (?, NOW(), ?, 1, ?, NOW())") or die($db->error);
                        $stmt->bind_param("iis", $id, $ip, $ckey) or die($stmt->error);
                        validateUser($id, $fullname, $level, $ckey, $rememmber);
                    } else {
                        $stmt = $db->prepare("INSERT INTO `ulog` (`user_id`, `signin_time`,`ip`, `logged_in`) VALUES (?, NOW(), ?, 1)") or die($db->error);
                        $stmt->bind_param("ii", $id, $ip) or die($stmt->error);
                        validateUser($id, $fullname, $level);
                    }
                    $stmt->execute() or die($stmt->error);
                    $stmt->close();
                    response('success', 'Daxil oldunuz. Səhifənizə yönləndiriləcəksiniz.');
                    exit;
                } else {
                    response('error', 'Şifrə düzgün deyil');
                    die();
                }
            } else {
                response('error', 'Bu istifadəçi müvəqqəti olaraq ban edilib.');
                die();
            }
        } else {
            response('error', 'Bu email aktiv edilməyib');
            die();
        }
    } else {
        response('error', 'Siz bir dəfə daxil olmusunuz.');
        die();
    }
} else {
    response('error', 'Bu email adresi ilə istifadəçi bazamızda mövcud deyil.');
    die();
}

1 Ответ

2 голосов
/ 16 ноября 2011

Вот несколько соображений:

  1. Не отображать форму входа для пользователей, вошедших в систему.
  2. Используйте простой метод, чтобы определить, вошел ли пользователь в систему.Если вы используете только сеанс, просто проверьте переменную сеанса.Если вы используете cookie-файл, сохраните идентификатор cookie-файла в пользовательской таблице.
  3. Если пользователь каким-либо образом повторно входит в систему (используя кнопку «Назад» для повторного доступа к форме), вы все равно можете проверить, чтобы увидетьесли они уже вошли в систему с использованием идентификатора сеанса или файла cookie, просто продолжите.Лично я предпочел бы просто заново войти в систему.
  4. Если вы хотите вести журнал регистрации, отлично, используйте его.Но не пытайтесь использовать его, чтобы определить, вошли ли они в систему.

Другой вариант, если вы действительно хотите сохранить свою текущую логику, - это изменить запрос на использование левого соединения.Таким образом, вы получите строку, если электронное письмо совпадает с тем, есть ли строка в журнале регистрации.Вот как бы вы написали левое соединение:

SELECT u.id, u.fname, u.lname, u.mname, u.level,
    u.pass, u.salt, u.approved, u.ban, u2.logged_in
FROM `users` AS u 
    LEFT JOIN `ulog` AS u2 ON u.id = u2.user_id
WHERE u.email=?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...