允许用户每24小时登录一次

时间:2011-09-17 10:23:18

标签: php mysql

我要做的是让用户每24小时访问一次应用程序。 一旦他们退出,他们必须再等24小时才能登录。 但我所注意到的是,如果它已经超过一小时它的工作原理。 但如果它不到一个小时它仍然给他们访问我不想发生。 我该怎么做才能修复此代码?

$dsn = 'mysql:dbname=DBNAME;host=127.0.01';
$user = 'USER';
$password = 'PASSWORD';

try {
    $dbh = new PDO($dsn, $user, $password); }
catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}


function currentMysqlTime($dbh) {
    $sql = $dbh->prepare("SELECT CURRENT_TIMESTAMP()");
    $sql->execute();
    $x = $sql->fetchAll();
    return $x[0][0];
}

 function lastLoginTime($dbh, $id) {
    $sql = $dbh->prepare("SELECT * FROM userpoints WHERE uid = ? AND pid = 2 ORDER BY timestamp desc LIMIT 1");
    $sql->execute(array($id));
    $y = $sql->fetchAll();
    return $y[0][3];
}
 function mysqlTimeDiff($dbh, $x, $y) {
    $sql = $dbh->prepare("SELECT TIMEDIFF(?, ?)");
    $sql->execute(array($x, $y));
    $z = $sql->fetchAll();
    return $z[0][0];
}
    function daysSinceLastLogin($x) {
      $parts = explode(':',$x);
      return $parts[0];
}

$currentMysqlTime = currentMysqlTime($dbh);
$lastLoginTime = lastLoginTime($dbh, $id);

    $timeDiff = mysqlTimeDiff($dbh, $currentMysqlTime, $lastLoginTime);
    $daysSinceLastLogin = daysSinceLastLogin($timeDiff);

if($daysSinceLastLogin < 0) {
//NO ACCESS AS THE USER HAS ALREADY LOGGED IN

} else {
//GRANT ACCESS AS IT IS THERE FIRST TIME LOGGING IN TO THE APPLICATION
}

这是函数的输出

报名时间2011-09-16 07:10:04
当前的Mysql时间2011-09-17 05:41:22
上次登录时间2011-09-14 05:00:07
时差72:41:15
日期差异3

2 个答案:

答案 0 :(得分:3)

使用下面的代码将为您提供一个布尔值,您可以使用它来确定登录的授权。

$timestamp = strtotime('-24 hours', currentMysqlTime($dbh)); 
$allowedToLogin = (bool) $dbh->fetchOne('SELECT 1 FROM  * FROM userpoints WHERE uid = ? AND timestamp <= ?', array($uid, $timestamp)); // Assuming ZF syntax here

如果匹配的时间戳低于引用,则可以通过验证布尔值$allowedToLogin来进行登录。

答案 1 :(得分:2)

供您使用时,您可能希望使用DATEDIFF代替TIMEDIFF。您目前正在检查自用户登录以来的小时数,而不是多少天。

此外,此代码

if($daysSinceLastLogin < 0) {

是错误的 - 首先,你要取一个字符串“-00:12:34.123456”,然后取第一部分 - “ - 00”。然后你将它转换为整数。由于零作为整数没有表达式,所以只得到0,所以在这种情况下你的条件永远不会成立。

错误的另一个原因是你想要检查它是否少于1(小时),不少于0天。