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

CodeIgniter 2调用Raja Ongkir API获运费报错:Undefined index: results如何修复?

修复CodeIgniter 2中Raja Ongkir API的"Undefined index: results"错误

这个Undefined index: results的Notice错误很常见,本质是你尝试访问数组里的results键,但这个键根本不存在——要么是API返回的响应结构和你预期的不一样,要么是你的请求本身就有问题,导致API没返回正常的结果。结合你的代码片段,我给你一步步拆解修复方案:

1. 补全并检查API请求的完整流程

你只贴了getcost方法的开头,大概率是调用Raja Ongkir API后直接去取$response['results'],但没做任何前置检查。先把API请求的完整逻辑补全,并加入错误判断:

public function getcost() { 
    $asal = 305; 
    $dest = $this->input->post('dest', TRUE); 
    $kurir = $this->input->post('kurir', TRUE); 
    $berat = 0; 

    // 计算购物车总重量(关键!你之前设为0,API会拒绝)
    foreach ($this->cart->contents() as $item) {
        // 假设每个商品的重量存在$item['weight']里,单位是克
        $berat += $item['qty'] * $item['weight'];
    }

    // 先检查重量是否合法,Raja Ongkir要求重量>0克
    if ($berat <= 0) {
        $this->session->set_flashdata('error', '总重量必须大于0克');
        redirect('your_checkout_page');
        return;
    }

    // 调用Raja Ongkir API的完整代码
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => "https://api.rajaongkir.com/starter/cost", // 专业版请替换对应URL
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "origin=$asal&destination=$dest&weight=$berat&courier=$kurir",
        CURLOPT_HTTPHEADER => array(
            "key: 你的Raja Ongkir API密钥", // 替换成实际密钥
            "content-type: application/x-www-form-urlencoded"
        ),
    ));

    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);

    // 第一步:检查curl请求是否失败
    if ($err) {
        $this->session->set_flashdata('error', '请求快递API失败:' . $err);
        redirect('your_checkout_page');
        return;
    }

    // 第二步:把JSON响应转成数组,检查解析是否成功
    $result = json_decode($response, true);
    if (json_last_error() !== JSON_ERROR_NONE) {
        $this->session->set_flashdata('error', 'API响应格式错误');
        redirect('your_checkout_page');
        return;
    }

    // 第三步:检查API返回的状态码(Raja Ongkir成功状态码是200)
    if ($result['rajaongkir']['status']['code'] != 200) {
        $error_msg = $result['rajaongkir']['status']['description'];
        $this->session->set_flashdata('error', 'API错误:' . $error_msg);
        redirect('your_checkout_page');
        return;
    }

    // 第四步:安全访问results键
    if (isset($result['rajaongkir']['results']) && !empty($result['rajaongkir']['results'])) {
        $shipping_options = $result['rajaongkir']['results'];
        // 把运费数据传给视图或做后续处理
        $data['shipping'] = $shipping_options;
        $this->load->view('checkout_shipping', $data);
    } else {
        $this->session->set_flashdata('error', '当前目的地/快递暂无可用配送选项');
        redirect('your_checkout_page');
    }
}

2. 核心修复点解析

  • 重量不能为0:你之前把$berat设为0,这是致命问题——Raja Ongkir API不接受重量为0的请求,会直接返回错误,自然不会有results键,必须从购物车计算实际总重量。
  • 嵌套结构访问:Raja Ongkir的响应是嵌套结构,results在rajaongkir节点下,不是直接在根数组里,正确路径是$result['rajaongkir']['results']。
  • 前置错误拦截:在访问任何API返回的键之前,先检查curl请求、JSON解析、API状态码是否正常,从源头避免Undefined index错误。

3. 调试小技巧

如果还是不确定问题出在哪,可以在curl_close($curl)之后加一行调试代码,打印完整的API响应:

var_dump($result);
exit;

这样你就能清楚看到API返回的所有数据,包括错误信息,快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:45:14