3

有没有办法限制用户每天登录次数不超过一次。这在PHP中可能吗?如果是这样,你能指导我怎么做吗?

在我的数据库中,我有用户名和密码字段以及时间戳?我还应该添加什么?

我试过这个,但问题是我不希望它限制IP并且应该尊重用户。

<?php
mysql_connect("localhost", "root", "");
mysql_select_db("");

mysql_query("delete from restrict where time >= " . time() + (24*3600));

$result = mysql_query("select * from restrict where ip =\"{$_SERVER['REMOTE_ADDR'}\"");

if(mysql_num_rows($result) == 0) {
$sql = "insert into restrict values('', '{$_SERVER['REMOTE_ADDR']}', '" . time() . "')";
mysql_query($sql);
} else {
die("You cannot access this page for 24hrs after you viewed it last...");
}

mysql_close();
?> 

对此的任何帮助将不胜感激。

谢谢!

4

5 回答 5

2

您是正确的,您不应受 IP 地址限制。一些原因包括:

  • 一些用户可以通过使用智能手机在街上行走或重新启动路由器来获得新的 IP 地址。
  • 一些 IP 地址由大量用户共享。一些 AOL IP 地址被数以万计的 AOL 用户(代理网关)共享。

如果您有上次成功登录的时间戳,只需检查该用户之前是否有过登录,如果有,那么他们尝试登录时该登录是多久之前的。

请记住,此方案中的任何内容都不会阻止用户尽可能长时间地保持登录状态,尽管他们必须经常与网站交互(亲自或使用机器人)以防止会话计时出去)。

于 2012-08-30T04:58:14.930 回答
2

您只需查询时间戳大于 24 小时前的位置。

$sql = "SELECT COUNT(1) FROM `users` WHERE `timestamp` >= DATE_SUB(NOW(), INTERVAL 1 DAY)";

如果有结果,不要让他们进来。

这假设您有一个带有时间戳字段的用户表,该字段在用户登录时更新。我不知道您在帖子中对整个限制表做了什么。

这是一个有缺陷的系统。您应该存储一个 cookie 或其他东西,以防出现问题并且他们被注销、发生某些事情等,在他们完成您所提供的任何服务之前。当然,如果不知道你到底在做什么,我能知道什么?

于 2012-08-30T04:59:13.257 回答
1

我只需在 login/users/whatever 表中添加一个类似“lastLoginTime”的列,并在用户登录时更新该时间。然后在登录时检查它以查看他们登录的时间 lastLoginTime 是否在最后12/24/任何时间。

于 2012-08-30T04:58:03.953 回答
1

是的,你可以像你说的那样做一个单独的表

id_user | date

两个整数

$db = new PDO('mysql:host=localhost;dbname=testdb', 'username', 'password');
$stmt = $db->prepare("SELECT * FROM `restrict` WHERE `id_user`=:id_user");
$stmt->execute(array(':id_user' => $_POST['username']));
$exist = $stmt->rowCount();
if(!$exist){
    $stmt = $db->prepare("INSERT INTO `restrict` VALUES(:id_user,:date)");
    $stmt->execute(array(':id_user' => $_POST['username']), ':date' => date('Ymd'));
} else {
    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if($row['date'] != date('Ymd')){
        $stmt = $db->prepare("UPDATE `restrict` SET `date`=:date WHERE `id_user`=:id_user)");
        $stmt->execute(array(':id_user' => $_POST['username']), ':date' => date('Ymd'));
    } else {
        die("You already accessed this page today.");
    }
}
于 2012-08-30T05:05:25.783 回答
0

您可以创建另一个名为 last_login 的列,用于存储登录时间。下次用户尝试登录时,检查 last_login 时间和当前时间之间的差异,如果小于 24 小时,则限制用户。

于 2012-08-30T04:58:23.343 回答