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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:27:20