我有一个名为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");
答案 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表中有任何内容,那么