在PHP中使用mysqli_fetch_array()时,试图访问null类型值的数组偏移量



在我的登录页面中。当用户名或密码不正确时,它既显示if条件语句;试图访问类型为null的值的数组偏移量;。请帮我解决这个问题。提前谢谢。

这是代码:

if(isset($_POST['login']))
{
$username=$_POST['username'];
$password=$_POST['password'];
$sql="select * from users where user_name='".$username."' and password='".$password."' ";
$result=mysqli_query($con,$sql); 
$row=mysqli_fetch_array($result,MYSQLI_ASSOC);
if (mysqli_num_rows($result) === 1) 
{
echo '<script>alert("Login successfully")</script>';
}
else
{   
if($row["user_name"] != $_POST['username'])
{   
echo "username is incorrect";
}
if($row["password"] != $_POST['password'])
{
echo "password is incorrect"; 
}
}
}

这是一个错误:

注意:试图访问C:\examplep\htdocs\selfstudy\login.php中第75行中null类型值的数组偏移量

用户名不正确

注意:试图访问第79行C:\examplep\htdocs\selfstudy\login.php中null类型值的数组偏移量

密码不正确

当没有从DB返回行时,很可能会引发错误,因为代码只处理返回的行数等于1的情况。

当返回0行时,$row就是null。当您尝试访问数组偏移$row["user_name"]$row["password"]时,它会抛出错误尝试访问类型为null的值的数组偏移,因为$row["user_name"]$row["password"]不存在。

要解决此问题,必须处理mysqli_num_rows($result) === 0的情况,或者必须事先检查isset($row["user_name"])isset($row["password"])

注意1:根据您的表设计,如果返回的行超过1行,代码将失败。我建议在您的SQL查询中添加LIMIT 1以避免这种情况。

注意2:您似乎还将密码以明文形式保存在数据库中。这是不好的做法。请查找密码哈希。这篇文章是一个很好的起点。

注意3:您可能需要考虑在else块中实现一个通用错误消息。返回类似于">您的用户名/密码不正确";

注意4:您对SQL注入攻击持开放态度。请查看提供的链接中的答案,并实现参数化的准备语句。

相关内容

  • 没有找到相关文章

最新更新