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
相关产品推荐
相关产品推荐

