CodeIgniter 3 MySQL数据库查询全场景错误处理问题咨询
解决CodeIgniter 3辅助函数中数据库全场景错误处理问题
我来帮你完善这个根据邮编获取经纬度的辅助函数,覆盖所有可能的数据库异常场景,同时解决你提到的$ci->db->error()返回空的问题。
核心问题分析
你之前拿不到错误信息,大概率是因为CodeIgniter默认开启了db_debug配置——当数据库出错时,框架会直接抛出错误页面,导致你的辅助函数代码根本没机会执行到error()方法。另外,之前的代码也没处理查询失败、多行返回这些场景。
完整的错误处理实现方案
下面是重构后的辅助函数,覆盖了连接失败、表不存在、无返回行、多行返回所有场景,同时确保错误信息能正确捕获,返回结构也能避免视图出现索引未定义的问题:
function get_lat_long_by_zip($zip_code) { // 获取CodeIgniter实例(辅助函数必须这么做) $ci =& get_instance(); // 统一返回结构,避免视图索引错误 $response = [ 'success' => false, 'data' => null, 'error_msg' => '' ]; try { // 临时关闭数据库调试模式(避免框架直接抛出错误页面) $original_debug_state = $ci->db->db_debug; $ci->db->db_debug = false; // 执行查询 $ci->db->select('latitude, longitude'); $ci->db->from('zip_codes'); // 替换成你的实际表名 $ci->db->where('zip_code', trim($zip_code)); $query = $ci->db->get(); // 恢复原来的调试模式设置 $ci->db->db_debug = $original_debug_state; // 1. 处理查询执行失败的情况(连接失败、表不存在、SQL语法错误等) if (!$query) { $db_error = $ci->db->error(); $response['error_msg'] = "数据库查询错误: {$db_error['message']} (错误码: {$db_error['code']})"; return $response; } $row_count = $query->num_rows(); // 2. 处理无返回行的情况 if ($row_count === 0) { $response['error_msg'] = "未找到该邮编对应的经纬度记录"; return $response; } // 3. 处理多行返回的情况(不符合单条记录的需求) if ($row_count > 1) { $response['error_msg'] = "该邮编对应多条经纬度记录,数据异常"; return $response; } // 4. 成功获取单条记录 $record = $query->row_array(); $response['success'] = true; $response['data'] = [ 'latitude' => $record['latitude'], 'longitude' => $record['longitude'] ]; return $response; } catch (Exception $e) { // 捕获其他未预料到的异常(比如参数错误、框架内部异常) $response['error_msg'] = "系统异常: {$e->getMessage()}"; return $response; } }
如何使用这个函数
在控制器或视图中调用时,先判断success状态,再访问数据,彻底避免索引未定义错误:
// 控制器中调用 $zip_result = get_lat_long_by_zip('90210'); if ($zip_result['success']) { // 成功获取数据,传递到视图 $data['latitude'] = $zip_result['data']['latitude']; $data['longitude'] = $zip_result['data']['longitude']; } else { // 传递错误信息到视图 $data['error'] = $zip_result['error_msg']; } $this->load->view('your_view', $data);
关键细节说明
- 临时关闭
db_debug:这是解决$ci->db->error()返回空的核心——如果保持默认开启,数据库出错时框架会直接终止程序输出错误页,你的代码根本走不到错误捕获逻辑。 - 统一返回结构:用
success标识状态,data存有效结果,error_msg存错误信息,确保调用方总能拿到合法的数组结构,不会出现索引未定义。 - 覆盖所有场景:从查询执行失败、无结果、多结果到全局异常,全部处理到,确保函数在任何情况下都能返回可预期的结果。
内容的提问来源于stack exchange,提问作者Kenny
相关产品推荐
相关产品推荐

