You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于TXT文件的PHP登录注册异常:仅最后注册用户可登录

问题分析与修复:基于TXT的PHP登录系统仅匹配最后一条用户记录

问题根源

  1. 遍历逻辑错误:你的登录代码中,foreach($arr as $rec)循环每次都会把$row变量覆盖为当前遍历的用户记录,循环结束后$row仅保留最后一条用户的数据,后续验证逻辑只针对这条记录,自然无法匹配之前的用户。
  2. 无效循环:循环结束后写的while(!feof($fp))完全无效,因为此时已经通过fclose($fp)关闭了文件指针,这个循环根本不会执行。
  3. 验证位置错误:用户验证逻辑没有放在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:40:15