您好我正在创建一个简单的登录系统。我知道我做的方式是完全不安全的,但它只是为了学习的目的,因为我是新的PHP。我在验证时遇到问题,现在它没有报告txt文件中是否存在用户名或密码。我还将使用会话(未完全实现)来跟踪用户是否登录。
<?php
session_start(); // session
if(isset($_POST['register'])) // Register USER
{
$user = $_POST['username'];
$password=$_POST['password'].PHP_EOL;
$fh = fopen("file.txt","a+");
fwrite($fh,$user." ".$password); //write to txtfile
fclose($fh);
}
txt文件中的输出如下所示:
user1 password1
user2 password2
这是我需要帮助的地方
if(isset($_POST['Login']))
{
$_SESSION['username']=$user;
$_SESSION['password']=$password;
$file = file_get_contents("file.txt");
if (strpos($file, "$user $password".PHP_EOL) !== false)
{
// go to login page
}
else
{
//ERROR
}
?>
答案 0 :(得分:3)
file_get_contents()
采用文件名,而不是文件指针,因此您应该使用file_get_contents('file.txt')
并删除fopen
调用。
http://php.net/manual/en/function.file-get-contents.php
然后,$file
的值是一个字符串,其中包含文件的所有内容作为单个字符串。因此,您可以使用普通的字符串操作,而不需要任何feof
内容。
但是你可能想看看file()
,它可能对你有用:
http://php.net/manual/en/function.file.php
编辑:
您的逻辑也存在问题。
您首先检查用户名,然后将密码作为单独的操作。这会将任何用户与任何用户的密码相匹配。假设我们的用户使用密码“foo”,并使用密码“bar”进行操作,以及当前逻辑,alice将能够以“foo”或“bar”作为密码登录。
所以你实际需要的是一个字符串,它是用户名和密码的串联,因为它在文件中找到(例如"alice foo".PHP_EOL
):
if (strpos($file, "$user $password".PHP_EOL) !== false) {
// go to login page
} else {
// error
}
您需要PHP_EOL
的原因是,这是您用来标记记录结尾的内容。如果您没有将它放在搜索字符串中,那么您将匹配真实密码的任何子字符串,包括空密码。 (该文件包含文字"alice foo".PHP_EOL
,其中包含文字"alice "
,但不包含文字"alice ".PHP_EOL
。)
答案 1 :(得分:1)
问题在于:
$fp = fopen ("file.txt", "r"); // read from file
$file = file_get_contents($fp);
使用fopen
,您可以逐行读取文件,并使用file_get_contents
通过将文件名指定为参数而不是文件句柄,将整个文件内容作为字符串。
你们两个都搞混了。
答案 2 :(得分:1)
引号内的php变量只会像字符串一样 $ _SESSION [ '用户名'] = “$用户”; 像这样使用$ _SESSION ['username'] = $ user;
答案 3 :(得分:0)
因为你正在学习,我不会给你代码,但可以给你逻辑 通过“\ n”爆炸 然后通过空格
爆炸结果数组值检查数组值0和1是否等于用户名和密码,如果相同则成功
仍有任何疑问可随意提问