注意:试图访问 null 类型值的数组偏移量 - mysqli_fetch_array?

Notice: Trying to access array offset on value of type null - mysqli_fetch_array?

我在使用 PHP 登录表单时遇到问题。

当用户名+密码正确时,一切正常,但如果不正确,则会报错:

Notice: Trying to access array offset on value of type null in /opt/lampp/htdocs/login/process.php on line 20 Login Failed!

我知道与 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_hash and password_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!";
}