基于TXT文件的PHP登录注册异常:仅最后注册用户可登录
问题分析与修复:基于TXT的PHP登录系统仅匹配最后一条用户记录
问题根源
- 遍历逻辑错误:你的登录代码中,
foreach($arr as $rec)循环每次都会把$row变量覆盖为当前遍历的用户记录,循环结束后$row仅保留最后一条用户的数据,后续验证逻辑只针对这条记录,自然无法匹配之前的用户。 - 无效循环:循环结束后写的
while(!feof($fp))完全无效,因为此时已经通过fclose($fp)关闭了文件指针,这个循环根本不会执行。 - 验证位置错误:用户验证逻辑没有放在
foreach循环内部,导致无法逐条检查所有用户记录。
修复后的登录代码
<?php $name = trim($_POST["txtusername"]); $pass = trim($_POST["txtpassword"]); // 提前判断空值,避免不必要的文件操作 if (empty($name) || empty($pass)) { header("location:home.php?id=fl"); exit; // 跳转后终止脚本,防止后续代码执行 } if (file_exists("user.txt") && filesize("user.txt") > 0) { $fp = fopen("user.txt", "r"); $str = fread($fp, filesize("user.txt")); fclose($fp); // 过滤分割后可能出现的空记录 $arr = array_filter(explode("//", $str)); $isValidUser = false; foreach ($arr as $rec) { $row = explode("/", $rec); // 确保数组索引存在,避免Undefined index错误 if (isset($row[2], $row[3]) && trim($row[2]) === $name && trim($row[3]) === $pass) { $isValidUser = true; break; // 找到匹配用户后立即终止循环,提升效率 } } if ($isValidUser) { $cookieExpire = isset($_POST["chk"]) ? time() + 60*2 : 0; setcookie("auth", $name, $cookieExpire); header("location:home.php?id=ls"); } else { header("location:home.php?id=fl"); } exit; } else { // 无用户记录时直接跳转失败页面 header("location:home.php?id=fl"); exit; } ?>
额外优化建议
- 密码安全:当前代码明文存储密码到TXT文件,风险极高,建议使用
password_hash()加密密码,登录时用password_verify()验证。 - 请求方式:登录/注册表单使用
method="POST",代码中用$_POST替代$_REQUEST获取参数,避免GET请求泄露敏感信息。 - 文件操作简化:可以用
file_get_contents("user.txt")替代fopen/fread/fclose,代码更简洁。 - 异常处理:增加文件读取失败的判断逻辑,避免因文件损坏导致的脚本报错。
内容的提问来源于stack exchange,提问作者Planet cool
相关产品推荐
相关产品推荐

