CodeIgniter无法识别POST表单提交问题求助(附相关代码)
我之前也碰到过CodeIgniter路由匹配POST请求的坑,你的问题大概率出在路由正则的匹配范围上,咱们一步步拆解:
先看你的路由规则:
$route["topic/(:num)/([a-z]+)"]["post"] = "forums/topic_post_reply/$1/$2";
这里的([a-z]+)正则表达式只匹配纯小写英文字母,但你提交的URL里的slug是test-topic-test——包含了连字符-,这条路由规则根本匹配不上,导致POST请求直接走了默认路由(或者返回404),自然不会执行你写的topic_post_reply方法。
1. 修正路由正则,支持连字符
把路由里的正则改成允许连字符的格式,如果你只需要支持小写字母和连字符,就用([a-z-]+):
$route["topic/(:num)/([a-z-]+)"]["post"] = "forums/topic_post_reply/$1/$2";
如果你的slug可能包含大写字母、数字,那就用更通用的([a-zA-Z0-9-]+),或者直接用([\w-]+)(\w匹配字母、数字、下划线):
$route["topic/(:num)/([\w-]+)"]["post"] = "forums/topic_post_reply/$1/$2";
2. 验证表单Action的正确性
确认$this->forums_model->slug($this->uri->segment(3))生成的slug格式和路由正则匹配,比如有没有生成带特殊字符(除了连字符)的内容,如果有的话还要调整正则范围。
3. 检查URI配置(可选)
如果你的项目配置了去掉index.php($config['index_page'] = '';),那表单action里的index.php/就多余了,可能会导致URI解析异常,但这不是你当前POST不被识别的核心问题,不过可以顺手确认下application/config/config.php里的$config['uri_protocol']设置为REQUEST_URI,确保CodeIgniter能正确解析URL。
如果还是有问题,可以先给控制器加一段调试代码,确认请求是否真的走到了这个方法:
public function topic_post_reply($id, $name) { // 先打印请求方法,看是否是POST echo "当前请求方法:" . $this->input->server('REQUEST_METHOD'); // 再打印POST数据 var_dump($this->input->post()); die; // 原业务代码... }
如果没输出任何内容,说明路由肯定没匹配上;如果输出了POST请求但POST数据为空,再检查表单的name属性是否正确(你的代码里是topic_reply_content,看起来没问题)。
内容的提问来源于stack exchange,提问作者P. Nick

