2011-09-17 6 views
0

私がやっていることは、ユーザーが24時間に1回アプリケーションにアクセスできるようにすることです。 ログアウトすると、ログインするまでにさらに24時間待たなければなりません。 しかし、私が気づいているのは、それが1時間以上経過していれば動作するということです。 しかし、時間が1時間未満であれば、それでも私は起こりたくないアクセスを提供しています。 このコードを修正するにはどうすればよいですか?ユーザーが24時間に1回ログインできるようにする

$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年9月17日午前5時41分22秒
最終ログインの

時間です時間ご利用については2011年9月14日5時00分07秒
時差72:41:15
日違い3

+3

このコードをデバッグしようとしましたか?たとえば、 'mysqlTimeDiff'と' daysSinceLastLogin'が正しい結果を出していることを確認しましたか? –

+1

@Oliと同様に、これは最初に適切なデバッグを要求します。 *正確に問題がどこにあるか知っていれば、もう一度やり直してください* –

+0

はいmysqlTimeDiffは、2つの日付の時差を比較し、HH:MM:SS、 ログイン日からの経過時間を比較するmysql関数を使用していますそのフォーマットを採用し、文字列を爆発させるので、最後のログイン時刻から何日を表示するかを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の代わりを使用したいです。あなたは現在、ユーザーがログインしてから何時間経過したかをチェックしています。また

、このコード

if($daysSinceLastLogin < 0) { 

は間違っている - 一つのことのために、あなたは文字列 "-00:12:34.123456" を取っている、その最初の部分を取って、 - "-00"。次に、整数に変換します。整数として負のゼロの式はないので、あなたはただ0を取得するので、このコンテキストでは条件は決して真ではありません。

もう1つの理由は、1日(時間)未満であるかどうかを0日以上チェックしたいということです。以下のコードで

関連する問題