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

Php 允许用户每24小时登录一次,php,mysql,Php,Mysql,我想做的是让用户每24小时访问一次应用程序。 一旦他们注销,他们必须再等待24小时才能登录到。 但我注意到,如果时间超过一个小时,它就会工作。 但如果还不到一个小时,他们仍然可以进入,这是我不希望发生的。 我可以做什么来修复此代码 $dsn = 'mysql:dbname=DBNAME;host=127.0.01'; $user = 'USER'; $password = 'PASSWORD'; try { $dbh = new PDO($dsn, $user, $password);

我想做的是让用户每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
}
$dsn='mysql:dbname=dbname;主机=127.0.01';
$user='user';
$password='password';
试一试{
$dbh=newpdo($dsn,$user,$password);}
捕获(PDO$e){
回显“连接失败:”。$e->getMessage();
}
函数currentMysqlTime($dbh){
$sql=$dbh->prepare(“选择当前时间戳()”;
$sql->execute();
$x=$sql->fetchAll();
返回$x[0][0];
}
函数lastlogentime($dbh,$id){
$sql=$dbh->prepare(“从用户点中选择*,其中uid=?和pid=2按时间戳desc LIMIT 1排序”);
$sql->execute(数组($id));
$y=$sql->fetchAll();
返回$y[0][3];
}
函数mysqlTimeDiff($dbh,$x,$y){
$sql=$dbh->prepare(“选择TIMEDIFF(?,)”;
$sql->execute(数组($x,$y));
$z=$sql->fetchAll();
返回$z[0][0];
}
函数daysSinceLastLogin($x){
$parts=分解(“:”,$x);
返回$parts[0];
}
$currentMysqlTime=currentMysqlTime($dbh);
$lastLoginTime=lastLoginTime($dbh,$id);
$timeDiff=mysqlTimeDiff($dbh,$currentMysqlTime,$lastLoginTime);
$daysSinceLastLogin=daysSinceLastLogin($timeDiff);
如果($daysSinceLastLogin<0){
//无法访问,因为用户已登录
}否则{
//在首次登录应用程序时授予访问权限
}
这是函数的输出

注册时间2011-09-16 07:10:04
当前Mysql时间2011-09-17 05:41:22
上次登录时间2011-09-1405:00:07
时差72:41:15

日期差异3对于您的使用,您可能希望使用
DATEDIFF
而不是
TIMEDIFF
。您当前正在检查用户登录后的时间,而不是天数

还有,这个代码

if($daysSinceLastLogin < 0) {
if($daysSinceLastLogin<0){
是错误的-首先,你要取一个字符串“-00:12:34.123456”,然后取它的第一部分“-00”。然后你要将它转换成一个整数。因为没有表达式将负零表示为整数,所以你只得到0,所以你的条件在这个上下文中永远不会为真


错误的另一个原因是,您希望检查它是否小于1(小时),而不是小于0天。

对于您的使用,您可能希望使用
DATEDIFF
而不是
TIMEDIFF
。您当前检查的是用户登录后的小时数,而不是天数

还有,这个代码

if($daysSinceLastLogin < 0) {
if($daysSinceLastLogin<0){
是错误的-首先,你要取一个字符串“-00:12:34.123456”,然后取它的第一部分“-00”。然后你要将它转换成一个整数。因为没有表达式将负零表示为整数,所以你只得到0,所以你的条件在这个上下文中永远不会为真


错误的另一个原因是,您希望检查时间是否小于1(小时),而不是小于0天。

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

$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
$timestamp=strottime('-24小时',currentMysqlTime($dbh));

$allowedToLogin=(bool)$dbh->fetchOne('select1from*FROM userpoints,其中uid=?和timestamp,使用下面的代码将为您提供一个布尔值,您可以使用它来确定登录的授权

$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
$timestamp=strottime('-24小时',currentMysqlTime($dbh));

$allowedToLogin=(bool)$dbh->fetchOne('SELECT 1 FROM*,FROM userpoints,其中uid=?和timestamp您是否尝试调试此代码?例如,您是否确认
mysqlTimeDiff
daysSinceLastLogin
给出了正确的结果?如@Oli所说,这需要首先进行正确的调试。当您知道问题的确切位置时,请再次询问关于这一点,是的,mysqlTimeDiff正在使用一个mysql函数来比较两个日期的时差,并以HH:MM:SS返回它们,因为登录后的天数采用这种格式并分解字符串,这样我就可以将小时除以24,以查看自上次登录后的天数。但是你没有除以24,所以你要检查自上次登录后的小时数!@M注意:例如,您需要添加一些
echo
语句(或在调试器中逐步执行)找出在出现故障时函数的具体输入和输出是什么。您是否尝试调试此代码?例如,您是否确认
mysqlTimeDiff
daysSinceLastLogin
给出了正确的结果?如@Oli所说,这首先需要进行适当的调试。当您知道问题是,请再次询问,是的,mysqlTimeDiff正在使用一个mysql函数,该函数比较两个日期的时差,并以HH:MM:SS返回,登录后的天数采用该格式并分解字符串,这样我可以将小时数除以24,以查看自上次登录后的天数。但你没有除以24,所以你是chec自上次登录后的一个小时!Matthew:您需要添加一些
echo
语句(或在调试器中逐步执行),以了解在出现问题时,函数的具体输入和输出是什么。+1一个干净简单的解决方案。+1一个干净简单的解决方案。