You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

关键细节说明

  1. 临时关闭db_debug:这是解决$ci->db->error()返回空的核心——如果保持默认开启,数据库出错时框架会直接终止程序输出错误页,你的代码根本走不到错误捕获逻辑。
  2. 统一返回结构:用success标识状态,data存有效结果,error_msg存错误信息,确保调用方总能拿到合法的数组结构,不会出现索引未定义。
  3. 覆盖所有场景:从查询执行失败、无结果、多结果到全局异常,全部处理到,确保函数在任何情况下都能返回可预期的结果。

内容的提问来源于stack exchange,提问作者Kenny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:35:02