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

CodeIgniter控制器特殊字符失效问题求助

解决罗马尼亚语特殊字符分类的URL匹配问题

首先,核心问题是URL里的特殊字符被编码后,你的控制器没有对其进行解码,导致传入数据库查询的是编码后的字符串,自然匹配不到原分类名。咱们一步步来解决:

1. 紧急修复:在控制器中解码URL参数

修改你的bar_view方法,先对传入的$name参数进行URL解码,再处理空格和下划线的转换:

public function bar_view($name = NULL){
    // 先解码URL中编码的特殊字符
    $decoded_name = urldecode($name);
    // 把下划线转回空格
    $name_to_pass = implode(' ', explode('_', $decoded_name));
    
    $category = $this->products_model->get_category_id($name_to_pass);
    $products = $this->products_model->get_bar_prods_by_category($category);
    
    $data['title'] = $name_to_pass;
    $data['products'] = $products;
    
    if(empty($data['products'])){
        show_404();
    }
    
    $this->load->view('templates/header');
    $this->load->view('menu/bar_view',$data);
    $this->load->view('templates/footer');
}

这样处理后,像P%C4%83linc%C4%83这类编码后的字符串会被转回Pălincă,就能和数据库里的原分类名匹配了。

2. 更健壮的方案:使用分类Slug(推荐)

直接用分类名转下划线的方式生成URL,虽然能解决当前问题,但长期来看可能遇到冲突(比如不同分类名转成下划线后完全一致),或者URL不够友好。建议给分类表添加一个slug字段,在添加分类时就生成对应的友好Slug:

步骤1:修改分类表

添加slug字段(建议设置为唯一索引,避免重复):

ALTER TABLE tbl_categories ADD COLUMN slug VARCHAR(255) UNIQUE AFTER category_name;

步骤2:生成Slug的函数

在你的模型或自定义辅助函数里添加一个生成Slug的方法,把罗马尼亚语特殊字符转成对应的普通ASCII字符,同时处理空格和特殊符号:

function generate_category_slug($category_name){
    // 映射罗马尼亚语特殊字符到普通ASCII字符
    $char_map = [
        'ă' => 'a', 'â' => 'a', 'î' => 'i', 'ș' => 's', 'ț' => 't',
        'Ă' => 'A', 'Â' => 'A', 'Î' => 'I', 'Ș' => 'S', 'Ț' => 'T'
    ];
    
    // 替换特殊字符
    $slug = strtr($category_name, $char_map);
    // 转小写,替换空格为下划线,移除非字母数字下划线的字符
    $slug = strtolower($slug);
    $slug = preg_replace('/[^a-z0-9_]/', '', str_replace(' ', '_', $slug));
    
    return $slug;
}

步骤3:添加分类时生成并存储Slug

当管理员添加分类时,调用这个函数生成Slug并存入数据库:

// 示例:添加分类的控制器方法
public function add_category(){
    $category_name = $this->input->post('category_name');
    $slug = generate_category_slug($category_name);
    
    $data = [
        'category_name' => $category_name,
        'slug' => $slug
    ];
    
    $this->products_model->insert_category($data);
    // 后续跳转逻辑
}

步骤4:修改URL生成和查询逻辑

  • 导航栏的URL改为使用Slug:
<?php foreach ($categories_bar as $category): ?>
    <a class="dropdown-item" href="<?php echo site_url('/bar/'.$category['slug']); ?>">
        <?php echo $category['category_name']; ?>
    </a>
<?php endforeach; ?>
  • 控制器查询改为用Slug获取分类ID:
public function bar_view($slug = NULL){
    // 直接用Slug查询分类
    $category = $this->products_model->get_category_by_slug($slug);
    if(!$category){
        show_404();
    }
    
    $products = $this->products_model->get_bar_prods_by_category($category['id']);
    $data['title'] = $category['category_name'];
    $data['products'] = $products;
    
    if(empty($data['products'])){
        show_404();
    }
    
    $this->load->view('templates/header');
    $this->load->view('menu/bar_view',$data);
    $this->load->view('templates/footer');
}
  • 模型中添加get_category_by_slug方法:
public function get_category_by_slug($slug){
    $query = $this->db->get_where('tbl_categories', ['slug' => $slug]);
    return $query->row_array();
}

3. 确认数据库字符集配置

虽然你已经设置了表的字符集,但最好再确认一下字段级别的字符集是否正确,避免局部字符集不匹配:

ALTER TABLE tbl_categories MODIFY category_name VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci;
ALTER TABLE tbl_categories MODIFY slug VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci;

这样处理后,不仅能解决当前的特殊字符匹配问题,还能让URL更友好,避免后续可能出现的冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:49