CI3中Try-Catch内调试$list_data_l变量及登录Forbidden问题排查
CodeIgniter3 AJAX登录Forbidden错误排查及调试方案
一、先排查Forbidden错误的常见原因
- CSRF令牌验证失败:CodeIgniter3默认开启CSRF保护,AJAX请求必须携带正确的CSRF令牌。前端需同步提交
csrf_token_name(默认是csrf_test_name)和对应的csrf_hash值,可通过表单隐藏域或AJAX参数传递。临时关闭config.php中$config['csrf_protection'] = FALSE测试,若错误消失则说明是CSRF问题。 - XSS过滤触发拦截:表单验证规则中的
xss_clean可能误判输入内容为恶意,可临时移除该规则测试是否恢复正常。 - 数据库连接/权限问题:检查
database.php中database_two的配置是否正确,确认数据库用户拥有login_session表的查询权限。 - .htaccess配置问题:检查项目根目录的
.htaccess规则,是否存在拦截AJAX请求的Rewrite规则,或目录权限不足。
二、$list_data_l变量的替代调试方案
AJAX请求下直接用var_dump/print_r/echo会导致响应格式不符合JSON预期,前端无法正常显示,可采用以下方案:
1. 写入CodeIgniter系统日志
利用框架自带的日志功能,将变量内容写入日志文件:
// 在$list_data_l赋值后添加 log_message('debug', '查询结果: ' . print_r($list_data_l->result(), true)); log_message('debug', '执行的SQL语句: ' . $this->two_db->last_query());
- 确保
config.php中$config['log_threshold'] = 2(开启Debug日志),日志文件位于application/logs/目录下。
2. 返回JSON格式调试信息
临时修改响应内容,将调试数据封装成JSON返回,在浏览器开发者工具的Network面板查看:
// 替换原有的var_dump($list_data_l); die; $debug_data = array( 'status' => 'debug', 'list_data' => $list_data_l->result(), 'sql' => $this->two_db->last_query(), 'csrf_hash' => $this->security->get_csrf_hash() ); exit(json_encode($debug_data));
3. 写入服务器临时文件
将变量内容写入服务器的临时文件,直接查看文件内容:
// 确保目录有写入权限,比如项目内的logs目录 file_put_contents(APPPATH . 'logs/debug_login.txt', print_r($list_data_l, true) . "\n\n", FILE_APPEND);
4. 输出数据库错误信息
若查询失败,直接捕获数据库错误:
$db_error = $this->two_db->error(); if (!empty($db_error)) { log_message('error', '数据库错误: ' . $db_error['message'] . ' 错误码: ' . $db_error['code']); }
内容的提问来源于stack exchange,提问作者Zombatar
相关产品推荐
相关产品推荐

