require规则不拦截空格等“伪空值”,因其仅判断php的empty(),而" "、"0"等非empty;需配合trim或自定义规则确保数据洁净。

require 规则不拦空格,这是设计使然
require 只判断值是否为 PHP 的“空”(即 empty() 为 true),而 " "(纯空格)、"\t\n"、"0" 在 PHP 中都不是 empty(),所以验证会通过。这不是 Bug,是规则本意——它只管“有无”,不管“净不净”。
- 用户输一串空格再提交?
require不报错 - 字段值是字符串
"0"或"0.00"?require也不拦 - 真正要拦“无效输入”,得配合
trim+ 自定义规则,或改用更严格的验证方式
ThinkPHP 3.x 的 $_validate 默认不自动 trim
TP3.2 的自动验证器在执行 require 前,**不会预先调用 trim()**。它拿到的就是原始 $_POST 值,包括首尾空格。很多开发者卡在这儿,以为“写了 require 就万无一失”,结果数据库里存了一堆带空格的脏数据。
- 解决办法不是改框架,而是显式加一条
regex规则:array('title', '/^\S.*$/', '标题不能以空格开头') - 或者在验证前手动处理:
I('post.title', '', 'trim')(利用 I 函数的过滤能力) - 注意:TP3 的
$_validate数组第 4 项“验证条件”设为3(全部时间)也没用——trim 不是验证规则,得自己做
TP5/6 的 Validate 类也默认不 trim,但更易干预
新版 ThinkPHP 的独立验证器(如 app\index\validate\User)同样不自动去空格,但它支持在 $rule 里直接写闭包或方法名,比 TP3 灵活得多。
- 可以这样写:
'username' => ['require', function($value) { return trim($value) !== ''; }] - 更推荐复用内置规则:
'username' => 'require|alphaNum|length:2,20',再配合前端trim+required - 关键点:验证器只校验,不修改数据;想让入库值干净,还得在
save()前手动trim字段,或用自动填充($_auto或$auto)
空值插入数据库的根本原因常被误判
很多人看到“验证没拦住空格”,就以为是验证器失效,其实更大概率是:验证失败后,代码仍继续执行了 save() 或 SQL 插入。
- 典型错误:
if (!$validate->check($data)) { $this->error(...); }后面没return,接着就$model->save($data) - TP3 中
D('User')->create()返回false时,也要手动判断,不能直接传给add() - 最稳做法:把验证和写库锁在同一逻辑分支里,验证不通过就终止流程,别留“漏网之鱼”
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











