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

CodeIgniter搜索功能异常:数组转字符串及数据传递问题排查

解决CodeIgniter搜索筛选的两个问题

嘿,我来帮你搞定这两个问题,咱们一步步拆解:

问题1:筛选器数据存入数组后搜索失效

你控制器里的数组赋值犯了一个典型错误——所有筛选字段都用了同一个键hladat,这会导致后面的字段值直接覆盖前面的,最后数组里只剩最后一个筛选项的值,搜索当然失效啦。

修正控制器代码

把$udaje数组改成每个筛选字段对应独立的键,这样每个筛选条件都能被正确传递,还可以过滤掉空值避免无效查询:

function triedit() {
    $this->load->model('base_model');
    // 给每个筛选字段设置独立键,对应表单的name属性
    $udaje = array(
        'pozicia' => $this->input->post('p'),
        'stav' => $this->input->post('s'),
        'technologia' => $this->input->post('st'),
        'datum' => $this->input->post('d'),
        'zariadenie' => $this->input->post('z')
    );
    // 自动过滤空值,避免无意义的查询条件
    $keyword = array_filter($udaje);
    $data['resulte'] = $this->base_model->triedit($keyword);
    $this->load->view('base_triedit_view',$data);
}

修正模型的查询逻辑

原来的模型直接用like('ckod_otk',$keyword)完全不对——$keyword是数组,而且你要针对不同的数据库字段做筛选。我们需要循环筛选条件,只对有值的字段添加查询规则:

function triedit($keyword) {
    $this->db->select('*');
    $this->db->from('otk');
    // 循环处理每个有效筛选条件
    foreach ($keyword as $field => $value) {
        // 根据字段名匹配对应的数据库列(请根据你的实际表结构调整)
        switch($field) {
            case 'pozicia':
                $this->db->like('otk.pozicia_otk', $value);
                break;
            case 'stav':
                $this->db->like('otk.stav_otk', $value);
                break;
            case 'technologia':
                $this->db->like('otk.technologia_otk', $value);
                break;
            case 'datum':
                $this->db->like('otk.datum_otk', $value);
                break;
            case 'zariadenie':
                $this->db->like('otk.zariadenie_otk', $value);
                break;
        }
    }
    $this->db->join('technologia', 'technologia.id_technologia = otk.technologia_otk', 'left');
    $this->db->join('zariadenie', 'zariadenie.id_zariadenie = otk.zariadenie_otk', 'left');
    $this->db->join('zamestnanci', 'zamestnanci.id_zamestnanci = otk.operator_otk', 'left');
    $this->db->join('stav', 'stav.id_stav = otk.stav_otk', 'left');
    $query = $this->db->get();
    // 返回结果集(而非行数),同时用result_array()返回数组
    return $query->result_array();
}

问题2:让模型返回数组而非对象

CodeIgniter提供了两种结果集返回方式:

  • result():返回对象数组
  • result_array():返回关联数组

所以只要把模型里的return $query->num_rows();改成return $query->result_array();就行,这样传到视图的就是纯数组了。

修正视图渲染代码

现在$resulte是关联数组,循环时要改用数组下标访问字段:

<?php if(is_array($resulte) && !empty($resulte)): ?>
    <?php foreach ($resulte as $row) {?>
    <tr>
        <td></td>
        <td><?php echo $row['czakazky_otk']; ?></td>
        <td><?php echo $row['pozicia_otk']; ?></td>
        <!-- 其他字段都改成数组下标形式 -->
    </tr>
    <?php } ?>
<?php endif; ?>

额外小提醒

  1. 请根据你的实际数据库表结构,调整模型中like对应的列名;
  2. 如果需要精确匹配(而非模糊搜索),把like改成where即可;
  3. 加个!empty($resulte)判断,可以避免空数组时的无效循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:56:07