CodeIgniter中分类select联动子分类下拉框失效且报SQL错误
问题分析与修复方案
核心问题1:SQL语法错误根因
- 你传递的
category是分类名称(字符串类型),直接拼接进SQL语句时没有加引号,就算成功拿到分类值也会触发语法错误。 - 当
$this->input->post('category')未获取到有效值时,SQL拼接后变成SELECT name FROM subcategory WHERE parentcategory=,就是你控制台看到的报错内容。 - 直接拼接SQL还存在SQL注入风险,不符合CodeIgniter的安全开发规范。
核心问题2:控制器返回内容错误
你在加载子分类视图后额外执行了echo $category;,会导致返回给前端的内容是<option>标签 + 分类名文本,插入到select标签后会破坏下拉选项结构,就算SQL执行正确也无法正常渲染子分类。
可选优化点
建议父分类<option>的value用分类ID而非名称,查询效率更高,也能避免分类名重复带来的查询异常。
修复后代码
控制器subcategories方法
public function subcategories() { // 增加参数非空校验,避免无意义的SQL查询 $category = $this->input->post('category'); if(empty($category)) { exit; } // 使用CodeIgniter查询绑定,自动加引号、防注入 $query = $this->db->query('SELECT name FROM subcategory WHERE parentcategory = ?', [$category]); $data['subcategories'] = $query->result_array(); // 仅加载视图,删除多余的echo语句 $this->load->view('homecontroller/subcategories', $data); }
(可选优化)主视图分类下拉框修改
如果你的分类表有主键ID,建议将value改为分类ID,同步修改SQL的查询字段为对应父分类ID字段即可:
<select id="sl_countries" class="form-control" name="cname" aria-label="Default select example"> <?php foreach($listcategory as $val){ echo '<option value="'.$val->id.'">'.$val->name.'</option>'; }?> </select>
内容的提问来源于stack exchange,提问作者Zubi Da
相关产品推荐
相关产品推荐

