Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
第n次登录尝试后阻止用户-PHP_Php_Mysqli_Login Script - Fatal编程技术网

第n次登录尝试后阻止用户-PHP

第n次登录尝试后阻止用户-PHP,php,mysqli,login-script,Php,Mysqli,Login Script,我正在登录中工作,因此不成功的登录尝试将存储在数据库中 然后,在第三次登录尝试后,将根据记录的IP地址和/或用户帐户禁用受影响用户的登录 不幸的是,我的代码没有按预期工作;登录尝试未存储到数据库中,受影响用户的登录仍然未被禁用 我做错了什么?我该如何修复它 下面是我的登录脚本: session_start(); //Get IP address // code goes here $loginDate = date("Y-m-d H:i:s"); $Error

我正在登录中工作,因此不成功的登录尝试将存储在数据库中

然后,在第三次登录尝试后,将根据记录的IP地址和/或用户帐户禁用受影响用户的登录

不幸的是,我的代码没有按预期工作;登录尝试未存储到数据库中,受影响用户的登录仍然未被禁用

我做错了什么?我该如何修复它

下面是我的登录脚本:

session_start();

//Get IP address
// code goes here

$loginDate      = date("Y-m-d H:i:s");
$Error          = "";
$successMessage = "";

if (($_REQUEST['captcha'] == $_SESSION['vercode'])) {
    //captcha code goes here

    if (isset($_POST['submit'])) {
        if (!( $_POST['username'] == "" && $_POST['password'] == "")) {
            //submit form codes goes here

            if (filter_var($username, FILTER_VALIDATE_INT)) {
                $con = mysqli_connect("localhost", "root", "", "test");
                $result = mysqli_query($con, "SELECT * FROM Users WHERE username='$username' AND password='$password'");
                $loginAttempt = mysqli_query($con, "SELECT * FROM Logs WHERE username='$username'");
                $data = mysqli_fetch_row($result);

                if (count($data)>0) {
                    $_SESSION['login_user']=$username;
                    mysqli_query($con, "INSERT INTO `test`.`Logs`(`username`, `lastLogin`, `ipAddress`, `captcha`) 
                                VALUES('$username', '$loginDate', '$ipaddress', '$captcha')
                                ON DUPLICATE KEY UPDATE `username` = '$username', `lastLogin` = '$loginDate'");
                    header('Location: privatepage.php');
                } else {
                    $Error ="Invalid Contract Number or Password";
                }
                mysqli_close($con);
            }     else {
                $Error ="Invalid Contract Number";
            }

            if (($data['username'] == $username) || ($data['password'] == $password)) {
                $loginAttempt = mysqli_query($con, "UPDATE Logs SET loginAttempt = 0 WHERE username='$username'");
                mysqli_close($con);
            } else {
                if ($loginAttempt >= 3) {
                    echo 'Sorry your account has been lock out. Please contact the administrator';
                } else {
                    mysqli_query($con, "UPDATE Logs SET loginAttempt = loginAttempt +1 WHERE username= '$username'");
                }
            }
        }
    }
}
我得到了这个错误:

PHP注意:未定义变量:第62行的loginattent

PHP警告:mysqli_query():无法在第65行获取mysqli


您的$data在mysql中只包含行数

 $data = mysqli_num_rows($result);

考虑使用mysqli_fetch_row

根据用户的不同,您不会获取
日志
表数据。 您应该在
$data['loginattest']
并将此
$data['loginattent']
更改为
$loginattent

$LoginAttempt = mysqli_query($con, "SELECT loginAttempt FROM Logs WHERE contractNumber='$cnumber'");
因此,检查尝试请求的条件如下

if($LoginAttempt >= 3){
// Your code goes here
}

在检查$LoginAttest是否低于3之前,您需要先获取$LoginAttest。试着这样做:

$loginAttempt = mysqli_query($con, "SELECT * FROM Users WHERE contractNumber='$cnumber')->fetch_object()->loginAttempt;

if($loginAttempt >= 3) {
  ...
}

这很有帮助。@Gerton,我已经看到了那篇文章,但对于像我这样的初学者来说太广泛了。请看我更新的脚本。但它仍然没有更新数据库,也没有阻止用户请更正您的查询
$loginatext=mysqli_query($con,“SELECT*FROM Users,其中contractNumber='$cnumber'))->fetch_object()->loginatext
$loginattent=mysqli\u查询($con,“从contractNumber='$cnumber''的日志中选择*)->获取对象()->loginattent我现在更新了。但是我有一个错误:PHP解析错误:语法错误,意外的'else'(T_else)。请参阅更新的查询库以进行更正。但仍然登录尝试未存储在数据库中,并且阻止用户。您需要打印正在执行的查询。请查看我更新的脚本。但是它仍然没有更新数据库,也没有阻止用户。在检查$data==1i之前,您需要添加一个$loginattent检查,但是我有一个错误:PHP解析错误:语法错误,如果($loginattent)您还有两个其他项,则在后面添加意外的'else'(T_else)。第一个else必须是else if(),或者您需要将第二个else放在嵌套的if中。在$successMessage=“”之后,在脚本顶部取消$loginatetest;您需要将正确的值分配给$loginattent=mysqli_query($con,“SELECT*FROM Logs,其中username='$username')->fetch_object()->loginattent;