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
相关产品推荐
相关产品推荐

