我要做的是让用户每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
答案 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天。