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

CodeIgniter表单提交中‘vigo-b’为何被判定为非法键名?

问题原因与解决方案

你猜的完全没错!这个报错确实是因为表单字段名里的**连字符(-)**触发了CodeIgniter的输入键过滤规则。

为什么会报错?

CodeIgniter的system/core/Input.php里的_clean_input_keys函数,默认会验证所有输入键(包括表单字段名)的格式,默认的正则规则只允许字母、数字、下划线、冒号和斜杠,连字符不在允许范围内。你看到的报错就是这个函数检测到不符合规则的键后抛出的。

默认的函数代码片段大概是这样的:

function _clean_input_keys($str)
{
    if ( ! preg_match("/^[a-z0-9:_\/]+$/i", $str))
    {
        exit('Disallowed Key Characters.');
    }
    return $str;
}

两种解决办法

1. 修改表单字段名(推荐)

最简单也最稳妥的方式是把带连字符的字段名改成下划线,比如把vigo-b改成vigo_b。这样既符合框架的默认规则,也不会影响业务逻辑,还避免了修改框架文件的麻烦。

2. 扩展Input类,允许连字符

如果业务上必须保留连字符,不要直接修改system目录下的核心文件(否则框架升级时会丢失修改),而是通过自定义扩展来重写这个函数:

  • 在application/core目录下创建MY_Input.php(如果没有这个文件的话)
  • 写入以下代码,把连字符加入允许的字符集:
<?php
class MY_Input extends CI_Input {
    public function _clean_input_keys($str)
    {
        // 新增连字符(-)到允许的字符列表中
        if ( ! preg_match("/^[a-z0-9:_\/-]+$/i", $str))
        {
            exit('Disallowed Key Characters.');
        }
        return $str;
    }
}

保存后,框架会自动加载这个自定义的Input类,你的带连字符的字段名就能正常通过验证了。

补充说明

框架默认禁止连字符是出于安全考量,防止恶意构造的输入键带来风险,但如果你的表单字段都是自己可控的,添加连字符是完全安全的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:33:21