使用保存在php文本文件中的帐户信息登录页面


Login to page with account info that is saved in a text file php

我有以下形式的

<form method="post" action="login.php">
    <table border="0" cellpadding="0">
        <tr>
            <td align="center" colspan="5">
                    <h4>Diary Login <br /><small>Please Login to manage Diary posts.</small></h4>
            </td>
        </tr>
        <tr>
            <td align="right"><b>Username:</b></td>
            <td align="left"><input type="text" name="username" /></td>                     
        </tr>   
        <tr>
            <td align="right"><b>Password:</b></td>
            <td align="left"><input type="password" name="password"/></td>
        </tr>
        <tr>
            <td align="left"><input type="submit" value="Login" name="submitBtn"/>
            <input type="reset" value="Reset" name="reset"/></td>
        </form>

这个表单从用户那里获得用户名和密码,然后按照php代码将其提交给他们进行验证。

<?php
$username = $_POST['username'];
$password = $_POST['password'];
if (isset($_POST['submitBtn'])){
$file = explode( "PHP_EOL", file_get_contents( "accounts.txt" ));
foreach( $file as $line ) {
list($username,$password) == explode( "||", $line );
if($_POST['username'] = $username && $_POST['password']) {
// User authenticated correctly
echo "You've successfully logged in!";
echo "<br>";
} else {
// User did not authenticate
echo "Invalid Username or Password";
}
}
} 
?>

我有一个名为accounts.txt的文本文件,它以以下格式存储用户数据

user1,password123
user2,passwordabc

我希望能够检查输入的数据,看看它是否与文本文件中注册的数据匹配。然而,当我运行此代码时,即使我输入的数据在文件中,我每次都会得到Invalid Username or Password。所以我输入以下内容,我仍然会得到无效的用户名或密码,即使这些值存储在我的accounts.txt文件中

user1
password123

在文件中注册。(我知道将数据存储在文本文件中是不安全的,但这是我被告知要做的教育目的,如果由我决定,我会给你一个数据库,但我做不到)。提前谢谢。

您使用PHP_EOL作为字符串而不是常量:

"PHP_EOL"

应该是

PHP_EOL

此外,根据您的信息,每个帐户的数据都用逗号分隔,但您可以尝试使用双管进行分解:||

因此

explode( "||", $line )

应该是

explode(",", $line)

如果您想在文本文件中使用双管分隔用户名和密码,可以保留以前的explode()函数,但必须确保实际使用了双管。

此外,您正在使用==进行分配,但它仅用于比较。为了正确地将explode( ",", $line )分配给list($username,$password),您需要使用=:

list($username,$password) = explode(",", $line);

提示

请注意,当使用逗号将用户名和密码分开时,并且您无法控制密码的设计方式,您可能会遇到这样的情况:

 // username,password
    some_name,myPass,word

这意味着,如果有人选择逗号作为密码的一部分,您对explode()的调用将返回意外信息。

还请注意,将用户信息存储在这样的文本文件中是一种非常糟糕的做法,因为(看起来,您呈现代码的方式)您的环境中密码以明文形式存储在该文件中。这是一个安全风险。以防你在意。


更新#1

我在这里发现了另一个问题:

if($_POST['username'] = $username && $_POST['password'])

在这里,您使用单个=符号进行比较,它应该是==:

if($_POST['username'] == $username && $_POST['password'] == $password)

请注意,由于您实际上没有比较密码,我将$_POST['password']更改为$_POST['password'] == $password


更新#2

获得多个输出的原因是,您将整个身份验证检查封装在foreach循环中。您的问题是,当不再需要循环时(当成功登录时),您的代码结构允许循环继续执行。

你可以将你的循环更新为:

$auth = false;
foreach( $file as $line ) {
    list($username, $password) = explode(",", $line);
    if ($_POST['username'] == $username && $_POST['password'] == $password) {
        $auth = true;
        break; // use this to stop iterating over $file and end the foreach-loop
    }
}
if($auth) {
    echo "Login successfull!";
} else {
    echo "Invalid username or password";
}

更新#3

如果现在您想进一步改进您的代码,您可以继续将整个登录功能封装到function中,方法是在脚本顶部定义该功能。

function authenticate($username, $password){
    $file = explode( PHP_EOL, file_get_contents( "accounts.txt" ));
    foreach( $file as $line ) {
        list($username, $password) = explode(",", $line);
        if ($_POST['username'] == $username && $_POST['password'] == $password)
            return true;
    }
    return false;
}

然后调用这个函数来进行这样的身份验证:

if(authenticate($_POST['username'], $_POST['password'])) {
    echo "Login successfull!";
} else {
    echo "Invalid username or password";
}