CodeIgniter3获取数据库记录时出现Illegal string offset警告求助
排查"Illegal string offset"警告:优惠券折扣功能故障修复
问题背景
从数据库获取优惠券记录时,持续触发Severity: Warning Message: Illegal string offset警告,涉及控制器、模型、视图三层代码逻辑问题,以下是具体分析与修复方案:
核心问题分析
- 参数传递不匹配:控制器调用模型时传入两个参数,但模型仅定义一个接收参数,导致模型内尝试访问字符串的数组偏移,直接触发警告。
- 数据格式与遍历冲突:模型返回单个对象,但控制器用数组遍历逻辑处理,用数组下标访问对象属性引发非法偏移警告。
- 条件判断逻辑无效:控制器将数组与数字直接比较,无法正确判断是否获取到有效优惠券记录。
- 表单参数缺失:视图隐藏字段未设置
name属性,导致控制器无法获取商品价格参数,后续计算逻辑异常。 - SQL条件遗漏:控制器传入商品价格作为查询条件,但模型SQL未包含该条件,优惠券与商品价格的匹配逻辑失效。
修复后的代码
1. 模型代码(Form_model.php)
public function get_discount($table, $condition){ // 补充商品价格查询条件,验证优惠券状态 $sql = "SELECT * FROM ? WHERE coupon_code = ? AND product_price = ? AND status= 'valid' "; $query = $this->db->query($sql, array($table, $condition['coupon_code'], $condition['product_price'])); // 返回数组格式,避免对象访问冲突 $result = $query->row_array(); if($query->num_rows() == 1){ return $result; } // 无匹配时返回空数组,避免后续逻辑报错 return array(); }
2. 控制器代码
public function get_discount(){ if($this->session->has_userdata('logged_in')){ // redirect(base_url()); } else { $output = array('error' => "failed"); $coupon_code = $this->input->post('coupon_code'); $product_price = $this->input->post('product_price'); // 先验证必要参数是否存在 if(empty($coupon_code) || empty($product_price)){ echo json_encode($output); return; } $condition = array( 'coupon_code' => $coupon_code, 'product_price' => $product_price ); $discount_data = $this->Form_model->get_discount('coupon', $condition); // 检查是否获取到有效优惠券 if(!empty($discount_data)){ $discount_rate = $discount_data['discount'] / 100; $discount_amount = $discount_rate * $product_price; $output['success'] = "success"; $output['discount'] = $discount_data['discount']; $output['final_price'] = $product_price - $discount_amount; } // 统一输出JSON,避免多次输出导致格式混乱 echo json_encode($output); } }
3. 视图代码
<form action="/get_discount" method="post"> <div class="form-group"> <h4 class="text-warning">*Optional</h4> <label>Coupon Code</label> <input class="form-control" name="coupon_code" type="text" id="coupon_code" /> <!-- 添加name属性,确保表单提交时携带商品价格参数 --> <input type="hidden" name="product_price" value="<?php echo $product->product_price?>" id="price" /> <div id="result"></div> <br style="clear:both;" /> <button class="btn btn-primary" id="activate">Activate Code</button> </div> </form> <div class="form-group"> <label>Total Price</label> <input class="form-control" type="number" value="<?php echo $product->product_price?>" id="total" readonly="readonly" lang="en-150" /> </div>
内容的提问来源于stack exchange,提问作者andy Precious
相关产品推荐
相关产品推荐

