微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

注意:尝试访问类型为null的值上的数组偏移量-mysqli_fetch_array吗?

如何解决注意:尝试访问类型为null的值上的数组偏移量-mysqli_fetch_array吗?

我在使用PHP登录表单时遇到麻烦。

当“用户名+密码”正确时,一切正常,但如果输入不正确,则会出现错误

注意:尝试访问数组偏移量中类型为null的值 /opt/lampp/htdocs/login/process.PHP,第20行登录失败!

我知道与MysqLi_fetch_array有关,但是我不知道什么。

PHP是最新版本7.4.8

<?PHP
// Get values from form in login.PHP

$username = $_POST['user'];
$password = $_POST['password'];

// To prevent sql injection
$username = stripcslashes($username);
$password = stripcslashes($password);
// $username = MysqL_real_escape_string($username);
// $password = MysqL_real_escape_string($password);

// Database Connection
$con = MysqLi_connect("localhost","root","1234","login");

// Query the Db for username
$result = MysqLi_query($con,"SELECT * FROM users WHERE username = '$username' AND password = '$password'")
        or die("Fail to connect to database".MysqL_error());
$row = MysqLi_fetch_array($result);
if ($row['username'] == $username && $row['password'] == $password){
    echo "Login succesfull!";
} else {
    echo "Login Failed!";
}

解决方法

问题是因为$row变量初始化为:

$row = mysqli_fetch_array($result);
当没有用户匹配提供的密码和用户名时,

等于null。快速解决方案是将成功登录的条件扩展到包含null检查:

if ($row !== null && $row['username'] == $username && $row['password'] == $password) {
    echo "Login succesfull!";
}

请注意,使用mysql_real_escape_string转义值可能仍不足以防止SQL注入。相反,应该使用带有类型化参数的预备语句。

此外,以纯文本格式存储密码确实不是一个好主意。建议使用例如password_hashpassword_verify函数。

,
$result = mysqli_query($con,"SELECT * FROM users WHERE username = '$username' AND password = '$password'")
        or die("Fail to connect to database".mysql_error());
if(mysqli_num_rows($result) > 0) {
    echo "Login succesfull!";
} else {
    echo "Login Failed!";
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。