2011-09-17 103 views
0

我想要做的是讓用戶每24小時訪問一次應用程序。 註銷後,他們必須再等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 7時10分04秒
當前Mysql的時間2011-09-17 5時41分22秒
最後登錄時間2011-09-14 5時00分07秒
時差72:41:15
的時間差3

+3

您是否嘗試過調試此代碼?例如,你是否證實'mysqlTimeDiff'和'daysSinceLastLogin'給出了正確的結果? –

+1

就像@Oli說的那樣,這需要先進行適當的調試。當你知道*問題出在哪裏時,再來詢問* * –

+0

是的mysqlTimeDiff使用了一個mysql函數來比較兩個日期的時間差異並以HH:MM:SS返回它們, 自登錄以來的天數採取這種格式並爆炸字符串,以便我可以將小時數除以24以查看自上次登錄時間以來的多少天。 – Aaron

回答

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

+1一個乾淨和簡單的解決方案。 – JJJ

2

供您使用,您可能需要使用DATEDIFF代替TIMEDIFF。您目前正在檢查用戶登錄後的時間,而不是多少天。

此外,該代碼

if($daysSinceLastLogin < 0) { 

是錯誤的 - 一件事,你正在做一個字符串 「-00:12:34.123456」,然後採取的第一部分 - 「-00」。然後你將它轉換爲一個整數。由於沒有表達式爲負整數,因此您只能得到0,所以在這種情況下您的條件永遠不會成立。

錯誤的另一個原因是您想要檢查它是否小於1小時,而不是小於0天。

相關問題