CodeIgniter取数后发送SMS遇变量未定义等错误求助
让我们一步步拆解这两个错误的根源,毕竟在CodeIgniter里处理表单提交和视图渲染的问题,大多和数据传递、流程逻辑的严谨性有关:
1. 「变量$result未定义」的问题分析
这个错误本质是视图渲染时找不到控制器传递的$result变量,通常有两种场景:
- 你的SEND按钮触发POST请求后,处理提交的控制器方法里,没有在所有代码分支下给视图传递$result。比如只有短信发送成功时赋值了$result,失败或者查询出错时直接跳过了赋值,导致视图找不到这个变量。
- 表单提交的目标控制器方法,和首次加载SENDSMS视图的方法不是同一个,而新方法里完全没处理$result的传递。
解决建议:
在处理SEND请求的控制器方法里,先初始化$result变量,确保无论逻辑分支如何,都能传递给视图:
public function send_sms() { $data = []; // 初始化$result为null,避免未定义 $data['result'] = null; if ($this->input->post()) { // 处理客户信息查询、短信发送逻辑 $customer_id = $this->input->post('customer_id'); $data['result'] = $this->db->where('id', $customer_id)->get('customers')->row(); // 短信发送逻辑... } $this->load->view('item/sms', $data); }
2. 「尝试获取非对象的属性」的问题分析
这个错误指向你视图第15行的代码,说明你在尝试访问某个变量的属性(比如$result->phone),但这个变量并不是预期的对象——它可能是null、false或者数组。
常见原因:
- 控制器里查询客户信息失败,返回了
null(比如用row()方法查询不到数据时会返回null),但你直接把这个null传给了视图,视图里直接访问它的属性就会报错。 - 你用了
result_array()获取查询结果(返回数组),但视图里却用对象语法(->)访问属性。
解决建议:
第一步:在控制器里校验查询结果
$customer_id = $this->input->post('customer_id'); $customer = $this->db->where('id', $customer_id)->get('customers')->row(); if (!$customer) { $data['error_msg'] = '未找到对应客户信息'; $data['result'] = null; } else { $data['result'] = $customer; }
第二步:在视图里做防御性判断
在第15行代码处,先判断$result是否有效再访问属性:
<div class="form-group"> <?php if (isset($result) && is_object($result)): ?> <label>客户手机号:</label> <input type="text" value="<?= $result->phone ?>" class="form-control"> <?php else: ?> <p class="text-danger"><?= isset($error_msg) ? $error_msg : '客户信息异常' ?></p> <?php endif; ?> </div>
额外排查点:表单提交的流程一致性
确认你的SEND按钮所在的表单,action属性指向的是正确的控制器方法,并且该方法同时处理了「首次加载视图展示客户信息」和「提交后处理短信发送」两种场景——避免因为请求路径不一致,导致数据传递逻辑断裂。
内容的提问来源于stack exchange,提问作者chari
相关产品推荐
相关产品推荐

