CodeIgniter数据库1064语法错误:仅Chrome偶现问题寻求解决方案
解决Chrome中CodeIgniter偶尔出现MySQL 1064语法错误的问题
从你给出的错误信息来看,核心问题是SQL语句select * from tbl_user_rights where usr_id=后面没有值,导致MySQL报语法错误。而这个问题只在Chrome中偶尔出现,大概率是用户ID(usr_id)的传递/初始化逻辑在Chrome环境下偶尔失效,结合CodeIgniter的常见使用场景,给你以下可行的解决方案:
1. 给函数加上参数校验,从根源避免错误SQL执行
在user_has_right函数的最开头,先对usr_id做有效性检查,确保只有合法值才会进入数据库查询环节。同时尽量使用CodeIgniter的查询构造器代替手动拼接SQL,既安全又能避免语法问题:
function user_has_right($right_key, $usr_id = null) { $CI =& get_instance(); // 优先从参数获取usr_id,参数为空则从会话取 if (is_null($usr_id)) { $usr_id = $CI->session->userdata('usr_id'); } // 校验usr_id是否合法:非空且为数字类型 if (empty($usr_id) || !is_numeric($usr_id)) { // 可以返回false或者记录错误日志,避免执行错误SQL log_message('warning', 'user_has_right called with invalid usr_id: ' . $usr_id); return false; } // 使用查询构造器执行查询,自动处理转义和语法 $query = $CI->db->get_where('tbl_user_rights', ['usr_id' => $usr_id]); // 后续的权限判断逻辑... }
2. 排查Chrome环境下的会话丢失问题
其他浏览器正常、Chrome偶尔出问题,很大可能是Chrome的会话(Session)偶尔丢失,导致usr_id无法从会话中获取。你可以做这些检查:
- 测试Chrome隐私模式下是否还会出现错误:如果隐私模式正常,说明是普通模式下的缓存或Cookie设置问题,建议用户清除Chrome的缓存和Cookie(快捷键
Ctrl+Shift+Delete)。 - 检查网站的Session Cookie配置:确保CodeIgniter的
config.php中$config['sess_cookie_name']、$config['sess_expiration']、$config['sess_domain']等参数配置正确,Chrome对第三方Cookie的限制可能会影响Session的保存。
3. 增加日志排查,定位偶现问题的触发场景
因为问题是偶尔出现的,建议在函数中增加日志记录,方便下次出现时定位原因:
// 在函数开头添加日志,记录调用时的usr_id值 log_message('debug', 'user_has_right triggered with right_key: ' . $right_key . ', usr_id: ' . $usr_id);
之后查看CodeIgniter的日志文件(默认在application/logs/目录),就能知道错误出现时usr_id到底是空值还是其他异常值,进一步缩小排查范围。
4. 检查AJAX请求的缓存问题(如果涉及)
如果user_has_right是通过AJAX调用的,Chrome默认会缓存GET请求,可能导致旧的请求数据被重复使用,从而出现usr_id为空的情况。可以在AJAX请求中添加cache: false:
// 示例jQuery AJAX请求 $.ajax({ url: '/your/url', type: 'GET', cache: false, // 禁用缓存 data: { right_key: 'xxx', usr_id: 'xxx' }, success: function(res) { // 处理结果 } });
内容的提问来源于stack exchange,提问作者News Dozens
相关产品推荐
相关产品推荐

