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