如何修复登录系统中仅能识别第一行用户数据的问题

2026-01-28 00:00:00 作者:花韻仙語

本文详解为何 php 登录功能只能验证 .txt 文件中的首行账号,指出 `foreach` 循环内过早触发“账户未注册”错误提示的根本原因,并提供修正后的安全、健壮的登录逻辑及关键优化建议。

问题根源在于登录函数 _login() 中的逻辑错误:“账户未注册”提示被错误地置于 foreach 循

环内部。每当尝试登录第二个(或后续)账号时,循环首先比对第一行的 NIS —— 显然不匹配,立即执行 else 分支并重定向,导致后续行根本无机会被检查。

以下是修复后的完整登录函数,已移除循环内错误的 else,仅在遍历全部行后仍未匹配时才判定为未注册:

private function _login()
{
    if (isset($_POST['login'])) {
        // 安全读取配置文件(建议使用绝对路径或预定义常量)
        $filePath = FCPATH . 'config.txt'; // 推荐:使用 CodeIgniter 的 FCPATH 常量
        if (!file_exists($filePath)) {
            $this->session->set_flashdata('message', 'User database unavailable.');
            redirect('Auth');
            return;
        }

        $data = file_get_contents($filePath);
        // 使用 array_filter() 移除空行(避免末尾换行符导致空数组项)
        $contents = array_filter(array_map('trim', explode("\n", $data)));

        $found = false;
        foreach ($contents as $values) {
            // 跳过空行或格式异常行(增强健壮性)
            if (empty($values) || substr_count($values, ',') < 2) continue;

            $login = explode(",", $values);
            // 确保至少有3个字段(NIS, name, password),防止索引越界
            if (count($login) < 3) continue;

            $nis = trim($login[0]);
            $name = trim($login[1]);
            $password = trim($login[2]);

            if ($nis === $_POST['nis']) {
                $found = true;
                if ($password === $_POST['password']) {
                    $userData = [
                        'nis' => $nis,
                        'name' => $name
                    ];
                    $this->session->set_userdata($userData);
                    redirect('User');
                } else {
                    $this->session->set_flashdata('message', 'Wrong password!');
                    redirect('Auth');
                    return; // 明确退出,避免后续处理
                }
            }
        }

        // ✅ 关键修复:仅当所有行都未匹配时,才提示“未注册”
        if (!$found) {
            $this->session->set_flashdata('message', 'Account is not registered!');
            redirect('Auth');
        }
    }
}

重要注意事项与进阶建议:

  • 安全性警示:当前方案将明文密码直接写入 .txt 文件并明文比对,存在严重安全隐患。生产环境务必改用 password_hash() 和 password_verify() 进行密码哈希存储与验证。
  • 文件路径规范:示例中使用了 #/config.txt,该路径非常规且易出错。应统一使用绝对路径(如 FCPATH . 'config.txt')或通过配置项管理,避免因工作目录变化导致读取失败。
  • 数据结构升级:文本文件难以扩展和维护。推荐迁移到轻量级数据库(如 SQLite)或至少使用 JSON 格式(json_encode()/json_decode())提升可读性与容错性。
  • 输入校验前置:在进入循环前,应对 $_POST['nis'] 和 $_POST['password'] 进行非空、长度、特殊字符过滤,防范基础注入与空值异常。
  • 性能考量:若用户量增长,逐行解析文本文件效率低下。届时需引入索引机制或切换至数据库查询(如 WHERE nis = ?)。

遵循以上修正与建议,即可彻底解决“仅识别首行”的问题,并为系统构建更可靠、安全、可持续的基础。

猜你喜欢

联络方式:

400 9058 355

邮箱:8955556@qq.com

Q Q:8955556

微信二维码
在线咨询 拨打电话

电话

400 9058 355

微信二维码

微信二维码