PHP读取文件异常:登录系统验证合法账号却输出两次false
登录系统验证失败的问题排查与修复方案
让我来帮你搞定这个登录验证的问题,你的代码主要有几个关键逻辑和细节错误,导致页面输出两次false,咱们一步步拆解:
核心问题分析
fgets()会保留换行符,导致匹配失效
你的info.txt里每一行末尾都有换行符(\n),但从GET参数获取的pass是纯文本(比如kodero1029),直接用$pass === fgets($file)永远无法匹配——因为前者是kodero1029,后者是kodero1029\n。循环内多次调用
fgets(),打乱文件指针顺序
原代码里,每次循环会两次调用fgets():第一次在密码判断里,第二次在用户名匹配里。这意味着每次循环会跳过一行内容,完全破坏了“用户名行→密码行”的对应关系。逻辑顺序颠倒
你先执行密码验证逻辑,再去匹配用户名,导致第一次循环时还没找到目标用户名就输出false,后续的文件指针也已经跳走了。
修正后的代码
<?php $pass = trim($_GET["pass"]); // 去除输入参数的首尾空白(包括意外空格) $user = trim($_GET["user"]); $next = false; $authSuccess = false; $file = fopen("info.txt", "r") or die("Something went wrong."); // 每次循环只读取一行,避免指针混乱 while(($line = fgets($file)) !== false) { $cleanLine = trim($line); // 去除文件行的换行符和首尾空白 if ($next) { // 验证密码(此时读的是用户名对应的下一行) if ($pass === $cleanLine) { $authSuccess = true; break; // 验证成功直接跳出循环,不用继续读文件 } $next = false; // 密码不匹配,重置标记 } else { // 匹配用户名 if ($user === $cleanLine) { $next = true; // 标记下一行需要验证密码 } } } // 根据验证结果输出 echo $authSuccess ? "true" : "false"; fclose($file); ?>
关键修正点说明
- 用
trim()统一处理换行符:不管是输入参数还是文件读取的内容,都去除首尾空白(包括换行符、空格),确保匹配的准确性。 - 单次读取一行:把每次读取的行存在变量里,避免多次调用
fgets()导致指针跳行。 - 调整逻辑顺序:先判断是否需要验证密码(
$next为true时),否则优先匹配用户名,完全贴合你“用户名行后紧跟密码行”的文件结构。 - 标记验证状态:用
$authSuccess变量记录最终结果,避免循环中不必要的输出,最后统一输出结果更清晰。
原代码输出两次false的原因
原代码的执行流程是:
- 第一次循环:
$next为false,直接输出false;然后调用fgets()读取第一行ch1ck3n,和传入的user匹配,把$next设为true。 - 第二次循环:
$next为true,调用fgets()读取第二行kodero1029\n,和传入的pass(无换行符)不匹配,输出false;然后再次调用fgets(),此时文件已经读完,返回false,和user不匹配,$next重置为false。 - 循环结束,总共输出两次
false。
内容的提问来源于stack exchange,提问作者user14401450
相关产品推荐
相关产品推荐

