在我的登录页面中。当用户名或密码不正确时,它既显示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注入攻击持开放态度。请查看提供的链接中的答案,并实现参数化的准备语句。