Php 当我在时间戳上使用“modify”时,它会给出错误的输出

Php 当我在时间戳上使用“modify”时,它会给出错误的输出,php,mysql,oop,Php,Mysql,Oop,我想阻止一个试图用错误密码登录4次的人 问题是:当我使用modify并将时间戳更改为15分钟时,我得到-1作为输出,两分钟后得到-2作为输出。我打了这么长时间的平手,在网上搜索了很多,但还是不起作用 我希望它如何工作: 数据库中有一列:falselog。如果访问者的用户名正确,但密码不正确,falselog将为+1。当falselog为4时,访客将被禁止15分钟。因此访问者可以尝试4次。15分钟后,访问者可以重试 这是我的对象和所有代码: public function logUser($use

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

问题是:当我使用modify并将时间戳更改为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; 
    }
} 

你应该在这里检查一下

$blockedSince = new DateTime($fetch2_1['lastlogin']);
如果您获得了DateTime的正确数据,请尝试var_dump$blockedSince;在该行之后,检查其内部是否有正确的值

试试这个
$blockedSince=mktime$fetch2_1['lastlogin']

我正在尝试使我的网站登录安全-其中username='.$username.-sha1$password-也许你应该首先修复基本问题。你能向我解释一下吗?它工作正常,谢谢!仅此:此帐户已挂起,请在-50分钟左右重试。这是错误的输出。时间来自等待。我现在就自己来修!: