Профилактический вход пользователя, если пользователь уже вошел - PullRequest
1 голос
/ 17 ноября 2011

У меня есть таблица пользователей с именем users и таблица журналов с именем ulog.Каждый раз, когда пользователь входит в систему, страница добавляет новую запись в таблицу журнала.

Чтобы предотвратить ошибки, перед входом я проверяю, вошел ли пользователь в систему или нет (я знаю, что это не так важно, есть другие методы для этой цели: например, я могу предотвратить это).проверяя файлы cookie или сеанс тоже, но мне интересно, как я могу сделать это с моей идеей).

Проблема в том, что код отлично работает, если в таблице ulog есть хотя бы одна строка о пользователе, который в данный момент пытается войти в систему.Если пользователь хочет войти в систему в первый раз, возникает проблема: код «пролетает» над операторами if ($stmt->num_rows > 0) { и выбирает else.(потому что num_rows возвращает 0)

Как я могу изменить свой запрос для обработки в обеих ситуациях: когда пользователь входит в систему в первый раз, а во второй, третий ... раз?

Мой код входа со стороны php выглядит следующим образом.

  $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) {
}
else die("You're already logged in");
}
else die("There is no such email in db");

Ответы [ 2 ]

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

Попробуйте это как;

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=?  or die($db->error);

Надеюсь, это поможет

1 голос
/ 17 ноября 2011

Попытка сделать левое внешнее соединение таблицы журнала. Это вернет null в первый раз, когда они попытаются войти в систему, потому что в таблице журнала для них ничего нет. Вам также нужно будет выполнить проверку на null в $ logged_in, как это имеет место. Проще всего было бы проверить на 1 в переменной $ logged_in, чтобы проверить, что они вошли в систему, поскольку любое значение, отличное от 1, будет означать, что они не вошли в систему.

Вот ваша первая строка переделана:

$sql['userLoggedIn'] = "
    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 OUTER JOIN `ulog` AS u2
        ON u2.user_id = u.user_id
    WHERE u.email = ?";

$stmt = $db->prepare($sql['userLoggedIn']) or die($db->error);

Попробуйте, посмотрите, делает ли это то, что вам нужно. Левые внешние соединения в основном состоят из Покажите мне, по крайней мере, все, что возвращается в таблицах ОТ. если что-то есть в таблицах LEFT OUTER JOIN, отметьте это тоже

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