Php 注意:尝试访问null-mysqli\u fetch\u数组类型的值上的数组偏移量?

Php 注意:尝试访问null-mysqli\u fetch\u数组类型的值上的数组偏移量?,php,mysqli,Php,Mysqli,我有一个PHP登录表单的问题 用户名+密码正确时,一切正常,但如果用户名+密码不正确,则会出现错误: 注意:尝试访问中null类型的值的数组偏移量 /第20行的opt/lampp/htdocs/login/process.php登录失败 我知道这与mysqli_fetch_数组有关,但我不知道是什么 PHP是最新版本7.4.8 <?php // Get values from form in login.php $username = $_POST['user']; $password

我有一个PHP登录表单的问题

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

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

我知道这与mysqli_fetch_数组有关,但我不知道是什么

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\u real\u escape\u string
转义值可能仍然不足以阻止SQL注入。相反,应该使用带有类型化参数的预处理语句


此外,以纯文本形式存储密码确实不是一个好主意。建议使用和函数实现一种机制。

或die(“无法连接到数据库”。mysql_error())–a)这不是您尝试建立数据库连接的部分,b)您在这里混合了mysqli和mysql函数(您不能这样做)。您不检查是否检索到了行,因此当详细信息不正确时,
$row
将不包含数组。这是否回答了您的问题?您不应该将密码存储为纯文本,请仔细阅读。还要学习使用准备好的语句。
//为了防止SQL注入
——你在那里做的事情绝对是大错特错的。去阅读如何正确地做到这一点;然后去阅读准备好的语句,并使用它们。无论如何,我会仔细检查代码,谢谢大家的建议@SouthDaveDV虽然这个解决方案会起作用,但是请考虑阅读正确的密码处理和SQL注入预防。您的代码的当前格式容易受到几次安全攻击。
$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!";
}