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

Php 登录仅适用于数据库中的第一个数据?,php,Php,这是我的login.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_sel

这是我的login.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>


问题是因为以下几行

$result=mysql_query("SELECT * FROM data");
while($row=mysql_fetch_array($result)){ ...
您使用
mysql\u query()
获取整个结果集,并且只从结果集中获取第一行。这就是为什么当您尝试使用第一个数据登录时,它会起作用,但当您尝试使用第二个或第三个数据登录时,它不会起作用

因此,解决方案是

按以下方式进行查询:

$result=mysql_query("SELECT * FROM data WHERE username = '$f_usr' LIMIT 1");
if(mysql_num_rows($result)){
    $row=mysql_fetch_array($result);

    // your code
}else{
    // Incorrect username
}
如果存在,它将返回一个由单行组成的结果集。然后在没有任何
循环的情况下获取行,如下所示:

$result=mysql_query("SELECT * FROM data WHERE username = '$f_usr' LIMIT 1");
if(mysql_num_rows($result)){
    $row=mysql_fetch_array($result);

    // your code
}else{
    // Incorrect username
}

旁注:

  • 不要使用
    mysql.*
    函数,它们从PHP5.5开始就被弃用,在PHP7.0中被完全删除。使用或代替

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

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


您的查询中没有where子句。请注意,由于安全问题,
mysql.*
现在不推荐使用
PHP7
。建议您切换到
mysqli_*
PDO
扩展。
“从username='ddd'和password='ddddd'所在的数据中选择*”
,并使用PDO避免sql注入。即使是这样也不安全!请已在PHP7中删除。了解关于使用PDO、.jayBrcAdAd的语句并考虑使用,那么列<代码>密码< /代码>不需要被包裹在后台文件中吗?它会工作吗?这是正确的-以关键字命名的列不需要有倒勾…除非它们被用作函数。这种情况很少见,但经常发生。如果是这样,那么就需要勾选。@Fred ii-这意味着如果一个函数或一个过程被命名为
password
,那么它应该被勾选,如果它被用作表名或列名,那么它就不需要被勾选,我说得对吗?基本上是@RajdeepPaul。