应使用 $this->input->post() 而非 $_post,因其默认执行 xss 过滤、trim 和数组递归处理;$_post 为裸数据,易导致脚本执行或内容截断。

直接用 $this->input->post(),别碰 $_POST —— 除非你明确知道要绕过CI的过滤和XSS防护。
为什么不能直接用 $_POST
CI 的 $this->input->post() 不只是取值,它默认做了三件事:xss_clean 过滤、trim 去首尾空格、对数组参数递归处理。而 $_POST 是裸数据,比如用户提交了 <script>alert(1)</script>,$_POST['content'] 会原样返回,$this->input->post('content') 默认会转义成 <script>alert(1)</script>。
常见错误现象:表单提交后页面显示乱码或脚本执行、富文本编辑器内容被截断、含 HTML 标签的字段存库失败 —— 很可能就是混用了 $_POST 且没手动过滤。
- CI 3.1.11+ 默认启用
xss_clean,但该方法已被标记为 deprecated;实际生效的是配置项$config['global_xss_filtering'] = TRUE(不推荐全局开) - 更稳妥的做法是按需调用:
$this->input->post('name', TRUE)第二个参数TRUE表示启用 XSS 过滤 - 若字段允许 HTML(如后台富文本),则用
$this->input->post('content', FALSE),但后续必须自己做白名单过滤
$this->input->post() 的参数行为和边界情况
这个方法看似简单,但几个细节决定是否取到值:
- 不传参数时返回整个 POST 数组:
$this->input->post()→array('name' => 'foo', 'email' => 'bar@example.com') - 字段名不存在时返回
NULL,不是空字符串或false,所以判空要用isset($this->input->post('key'))或!empty(),别用== false - 如果表单字段是数组形式,如
<input name="tags[]">,$this->input->post('tags')直接返回索引数组,无需额外解析 - 注意 CSRF 字段:若开启了
$config['csrf_protection'] = TRUE,$this->input->post()会自动忽略csrf_test_name这类 token 字段,不用手动 unset
POST 数据取不到?先检查这三处
90% 的“取不到 POST”问题跟框架配置或请求本身有关,不是代码写错:
- 确认表单
method="post"且action指向的是 CI 路由地址(如/index.php/user/save),不是直接指向 PHP 文件 - 检查
application/config/config.php中$config['allow_get_array']和$config['enable_query_strings']是否误设为TRUE,这会导致 GET 参数污染 POST 解析逻辑 - 用
var_dump($_SERVER['REQUEST_METHOD'])和var_dump(file_get_contents('php://input'))确认请求确实是 POST,且原始体非空——有些前端发 JSON 或application/json,CI 默认不解析,此时$this->input->post()必然为空
最常被忽略的一点:CI 的 post() 只解析 application/x-www-form-urlencoded 和 multipart/form-data 请求体。如果你用 fetch 或 axios 发 Content-Type: application/json,得改用 file_get_contents('php://input') 手动读原始 JSON,再 json_decode() —— $this->input->post() 对它完全无效。











