如果用户已登录,则阻止用户登录

时间:2011-11-17 00:28:10

标签: php mysql mysqli prepared-statement

我有一个名为users的用户表和名为ulog的日志表。每次用户登录时,页面都会将新记录添加到日志表中。

为了防止错误,在登录之前,我正在检查用户是否已经登录(我知道它不是那么重要,还有其他方法用于此目的:对于ex,我可以通过检查来阻止它饼干或会话,但我觉得如何用我的想法做到这一点很有趣)。

如果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 个答案:

答案 0 :(得分:2)

试试这个;

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 :(得分:1)

尝试执行日志表的左外连接。这将在他们第一次尝试登录时返回null,因为日志表中没有任何内容。您还需要对$ logged_in进行空检查,因为这是一种情况。更容易做的是在$ logged_in var中检查1以验证它们是否已登录,因为除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);

尝试一下,看看它是否符合你的需要。左外连接基本上是状态显示至少在FROM表中返回的所有内容。如果LEFT OUTER JOIN表中有任何内容,那么