电话
400 9058 355
本文详解为何 php 登录功能只能验证 .txt 文件中的首行账号,指出 `foreach` 循环内过早触发“账户未注册”错误提示的根本原因,并提供修正后的安全、健壮的登录逻辑及关键优化建议。
问题根源在于登录函数 _login() 中的逻辑错误:“账户未注册”提示被错误地置于 foreach 循 
以下是修复后的完整登录函数,已移除循环内错误的 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');
}
}
}重要注意事项与进阶建议:
遵循以上修正与建议,即可彻底解决“仅识别首行”的问题,并为系统构建更可靠、安全、可持续的基础。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...