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)

我有一个网站,我正试图添加多个管理员。登录时,只有数据库中的第一个用户名/密码组合有效,其他任何组合都会在下面的代码中抛出错误信息错误消息。好像是foreach的问题也许?我是PHP新手,不知道如何使用它:

<?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子句中的查询中直接匹配登录凭据。这是推荐的解决方案,而不是循环浏览所有记录。这是非常好的信息,谢谢!帮了一个笨蛋的忙。