登录仅适用于数据库中的第一个数据


Login only works for first data in database?

这是我的登录.php页面

<!DOCTYPE html>
<html>
<body>
<?php
$f_usr= $_POST["username"];
$f_pswd= $_POST["password"];
$con=mysql_connect("localhost","root","");
if(! $con)
{
        die('Connection Failed'.mysql_error());
}
mysql_select_db("login",$con);
$result=mysql_query("SELECT * FROM data");
while($row=mysql_fetch_array($result))
{
    if($row["username"]==$f_usr && $row["password"]==$f_pswd)
    {
        echo "<script language='"JavaScript'">'n";
        echo "alert('Successfully Log In');'n";
        echo "window.location='MainPage.html'";
        echo "</script>";
    }
    else
    {
        echo "<script language='"JavaScript'">'n";
        echo "alert('Username or Password was incorrect!');'n";
        echo "window.location='login.html'";
        echo "</script>";
    }
}
?>
</body>
</html>

这是我的register.php页面

<?php
$connect=mysqli_connect('localhost','root','','login');
if(mysqli_connect_errno($connect))
{
        echo 'Failed to connect';
}
?>
<?php
// create a variable
$username=$_POST['username'];
$password=$_POST['password'];
//Execute the query
mysqli_query($connect,"INSERT INTO data(username, password)
                VALUES('$username','$password')");
            if(mysqli_affected_rows($connect) > 0)
            {
                echo "<script language='"JavaScript'">'n";
                echo "alert('Successfully Register');'n";
                echo "window.location='MainPage.html'";
                echo "</script>";
            } 
            else 
            {
                echo "<script language='"JavaScript'">'n";
                echo "alert('Failed to Register');'n";
                echo "window.location='Register.html'";
                echo "</script>";
            }
?>

这是我的问题。我使用xammp,我的数据库中目前有3个数据。当我尝试使用数据库中的第一个数据登录时,它是有效的,但当我尝试用数据库中的第二个数据登录,它显示错误的用户名和密码?为什么?

问题是由于以下几行,

$result=mysql_query("SELECT * FROM data");
while($row=mysql_fetch_array($result)){ ...

使用mysql_query()获取整个结果集,并且仅从结果集中获取第一行。这就是为什么当你试图用第一个数据登录时,它是有效的,但当你尝试用第二个或第三个数据登录的时候,它不起作用。

因此解决方案是,

这样查询:

$result=mysql_query("SELECT * FROM data WHERE username = '$f_usr' LIMIT 1");

如果存在,它将返回一个由单行组成的结果集。然后获取没有任何while循环的行,如下所示:

if(mysql_num_rows($result)){
    $row=mysql_fetch_array($result);
    // your code
}else{
    // Incorrect username
}

旁注:

  • 不要使用mysql_*函数,它们从PHP 5.5开始就被弃用,在PHP 7.0中被完全删除。请改用mysqlipdo。这就是为什么不应该使用mysql_*函数。

  • 您的查询容易受到SQL注入的影响。始终准备绑定执行查询,以防止任何类型的SQL注入。这就是如何防止PHP中的SQL注入。

  • 永远不要将密码存储为纯可读文本,在将原始密码插入表之前,始终对其执行盐水密码哈希。

相关文章: