PHP登录页只能访问数据库中的第一个用户
我有一个网站,我正试图添加多个管理员。登录时,只有数据库中的第一个用户名/密码组合有效,其他任何组合都会在下面的代码中抛出错误信息错误消息。好像是foreach的问题也许?我是PHP新手,不知道如何使用它:PHP登录页只能访问数据库中的第一个用户,php,authentication,Php,Authentication,我有一个网站,我正试图添加多个管理员。登录时,只有数据库中的第一个用户名/密码组合有效,其他任何组合都会在下面的代码中抛出错误信息错误消息。好像是foreach的问题也许?我是PHP新手,不知道如何使用它: <?php session_start(); include_once('connection.php'); function test_input($data) { $data = trim($data); $data = stripslashes($data)
<?php
session_start();
include_once('connection.php');
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
if ($_SERVER["REQUEST_METHOD"]== "POST") {
$adminname = test_input($_POST["adminname"]);
$password = test_input($_POST["password"]);
$stmt = $conn->prepare("SELECT * FROM adminlogin");
$stmt->execute();
$users = $stmt->fetchAll();
foreach($users as $user) {
if(($user['adminname'] == $adminname) &&
($user['password'] == $password)) {
$_SESSION["authenticated"]="test";
header("Location: adminpage");
}
else {
echo "<script language='javascript'>";
echo "alert('WRONG INFORMATION')";
echo "</script>";
die();
}
}
}
?>
您正在选择所有用户:
$stmt = $conn->prepare("SELECT * FROM adminlogin");
然后一次遍历其中的每一个:
foreach($users as $user) {
但是如果第一次迭代不是正确的用户,则点击die()
并中止整个程序。因此,只有第一个用户才能登录
不要选择所有用户。你拥有的用户越多,这将变得越来越慢。相反,请使用WHERE子句最多选择一行:
$stmt = $conn->prepare("SELECT * FROM adminlogin WHERE username = :username");
$stmt->execute(["username" => $adminname]);
然后验证您是否返回了一行(即,您有一个有效的用户名),然后验证密码是否匹配
确保使用构建查询。有关一些好的示例,请参见和
此外,从不存储纯文本密码。而是使用和。例子
通常,您不希望使用诸如stripslashes()
,trim()
等函数对密码进行过滤/编码,因为它们会删除有效字符。else语句会导致此问题。您需要在if条件之前设置一个默认值为false的标志。删除else条件。在执行if条件时,将标志设置为true,这是非常错误的。您从不在数据库中存储明文密码。使用password\u hash()
和password\u verify()
。为什么不检查数据库中的特定用户名?还可以在where子句中的查询中直接匹配登录凭据。这是推荐的解决方案,而不是循环浏览所有记录。这是非常好的信息,谢谢!帮了一个笨蛋的忙。