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; ?>
额外小提醒
- 请根据你的实际数据库表结构,调整模型中
like对应的列名; - 如果需要精确匹配(而非模糊搜索),把
like改成where即可; - 加个
!empty($resulte)判断,可以避免空数组时的无效循环。
内容的提问来源于stack exchange,提问作者Nezo
相关产品推荐
相关产品推荐

