当我在我的时间戳上使用“修改”时,它会输出错误的输出

时间:2017-09-08 07:37:42

标签: php mysql oop

我想阻止一个尝试使用错误密码登录4次的人。

问题是:当我使用“修改”并将时间戳更改为15分钟时,我得到-1作为输出,两分钟后我得到-2作为输出。我绑了这么久,我在互联网上搜索了很多,但它仍然无效。

我希望它如何运作:
在数据库中是列:“falselog”。如果访问者的用户名正确但密码不正确,则falselog将为+1。当falselog为4时,访客将被禁止15分钟。因此,访问者可以尝试4次。 15分钟后,访客可以再试一次。

这是我的所有代码的对象:

public function logUser($username, $password) { 

    // query id = 2     
    $sql2_1 = "SELECT 
            id, 
            password, 
            falselog, 
            lastlogin
        FROM users
        WHERE username ='".$username."' ";

    $result2_1 = $this->con->query($sql2_1);
    $fetch2_1  = mysqli_fetch_array($result2_1);
    $count2_1  = $result2_1->num_rows; 

    $now          = new DateTime('now');    
    $blockedSince = new DateTime($fetch2_1['lastlogin']);

    $fout     = $fetch2_1['falselog'];
    $date_old = date ("Y-m-d H:i:s", strtotime("now")); 

    $block    = date("i", $fetch2_1['lastlogin']) + 16;         
    $current  = date("i", strtotime("now"));
    $wait     = $block - $current ; 
    $dbtime   = date ("Y-m-d H:i:s", strtotime($date_old));


    // This is the code that doesn't work
    if ($fetch2_1['falselog']>=4 AND $blockedSince->modify('+15 minutes') > $now) {
        $error[] = 'This account has been banned, try again about '.$wait.' minutes';
        $decline = true;  
        $date_old = $fetch2_1['lastlogin']; 
    } 

    elseif (!preg_match("/^[A-Za-z0-9-]+$/", $username)) { 
        $error[] = 'De input bevat ongeldige tekens (alleen cijfers en letters toegestaan)';
    } 

    elseif ($count2_1 === 0) {
        $error[] = 'Wrong login data';
    } 

    elseif ($fetch2_1['password']!=sha1($password)) {
        $error[] = 'wrong password';
        $fout = $fetch2_1['falselog']+1;
    } 

    if ((count($error) == 0) OR ($fetch2_1['falselog']==4 AND $blockedSince->modify('+15 minutes') < $now)) {
        $fout = 0; 
    }

    $sql2_2 = "UPDATE users SET 
            falselog='".$fout."', 
            lastlogin='".$dbtime."'
        WHERE username='".$username."' ";

    if ($this->con->query($sql2_2) === TRUE) {

        if (count($error) == 0) {
            return false; 
        } 

        else {
            return $error; 
        }
    } 

    else {
        echo "Error: " . $sql2_2 . "<br>" . $this->con->error;
        return true; 
    }
} 

2 个答案:

答案 0 :(得分:1)

你应该检查一下

$blockedSince = new DateTime($fetch2_1['lastlogin']);

你得到DateTime的正确数据,试试var_dump($ blockedSince);在这一行之后,检查它内部是否有正确的值;

答案 1 :(得分:0)

试试这个 $ blockedSince = mktime($ fetch2_1 [&#39; lastlogin&#39;]);