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

CodeIgniter 3中AJAX请求场景下MySQL错误捕获及客户端优雅提示的问题问询

解决CodeIgniter 3 AJAX请求中MySQL错误无法返回给客户端的问题

这个问题的核心原因是CodeIgniter 3默认会在数据库查询出错时直接抛出错误并终止脚本执行,返回HTTP 500状态码,导致你写的错误处理逻辑根本没机会运行。下面是具体的解决方案:

1. 关闭数据库自动报错输出

首先需要临时关闭CodeIgniter的数据库自动调试功能,这样查询出错时不会直接中断脚本,而是让我们手动处理错误信息。

你可以在需要处理的方法中临时设置,避免全局关闭影响其他业务:

function delete($customer_id) {
    // 临时关闭数据库自动报错,让我们手动处理错误
    $this->db->db_debug = FALSE;
    
    // 后续的查询和错误处理逻辑...
}

2. 调整PHP端错误处理与响应输出

修改你的delete方法,确保无论成功还是失败,都能通过JSON格式返回结果,并且正确设置响应头:

function delete($customer_id) {
    $this->db->db_debug = FALSE;
    
    // 执行删除查询
    $query = $this->db->query("DELETE FROM _customer WHERE customer_id = ?;", array($customer_id));
    
    // 初始化响应数据
    $response = [];
    
    if ($query) {
        $response['result'] = 'OK';
        // 设置成功的HTTP状态码
        $this->output->set_status_header(200);
    } else {
        // 获取MySQL错误详情(包含错误码和错误信息)
        $response['result'] = $this->db->error();
        // 可选:设置业务错误的状态码,比如400(错误请求)
        $this->output->set_status_header(400);
    }
    
    // 输出JSON格式的响应,确保前端能正确解析
    $this->output
         ->set_content_type('application/json')
         ->set_output(json_encode($response));
}

3. 前端适配处理

如果选择返回400状态码,前端的errorCallbackFunction需要解析响应体中的JSON数据来获取错误信息:

'errorCallbackFunction': function (r) {
    overlay.style.display = 'none';
    // 解析响应体的JSON数据
    r.response.json().then(errorData => {
        if (errorData?.result?.message) {
            showToast("Greška", errorData.result.message, "error").classList.remove("bg-dark");
        } else {
            showToast("Greška 468", "Došlo je do greške molim probajte ponovo ili osvežite stranicu.", "error").classList.remove("bg-dark");
        }
    }).catch(() => {
        showToast("Greška 468", "Došlo je do greške molim probajte ponovo ili osvežite stranicu.", "error").classList.remove("bg-dark");
    });
},

如果你希望统一返回200状态码(不需要修改前端错误回调),只需要去掉set_status_header(400)即可,这样前端的CallbackFunction会正常执行,进入else分支处理错误信息。

关键说明

  • db_debug = FALSE是核心:关闭这个配置后,CodeIgniter不会在数据库出错时直接抛出错误终止脚本,你的错误处理逻辑才能生效。
  • 使用CodeIgniter的Output类输出响应:确保响应头正确设置为application/json,避免前端解析JSON时出错。
  • 错误状态码可选:如果用200状态码,前端逻辑不需要大改;如果用400等业务错误码,能更符合HTTP语义,需要前端配合解析响应体。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:29:11