这是我的登录.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中被完全删除。请改用mysqli
或pdo
。这就是为什么不应该使用mysql_*
函数。您的查询容易受到SQL注入的影响。始终准备、绑定和执行查询,以防止任何类型的SQL注入。这就是如何防止PHP中的SQL注入。
永远不要将密码存储为纯可读文本,在将原始密码插入表之前,始终对其执行盐水密码哈希。