我有以下形式的
<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";
}