如何实现ThinkPHP请求参数严格类型校验?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1060个文字,预计阅读时间需要5分钟。
很多人以为只要写了以下内容:
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 在验证规则里加
'type' => 'integer'(仅 TP6.1+ 支持),但注意它只校验 PHP 类型,不处理自动转换 - 更可靠的做法:先用
input()拿原始值,再用intval()/floatval()/(int)显式转换,然后和原始字符串比对是否“无损” - 例如判断是否纯整数:
$raw = $this->request->param('id'); $num = (int)$raw; if ((string)$num !== $raw) { // 类型不一致 }
TP6 中 Validate 类的 rule 与 scene 对类型校验的影响
场景不同,校验时机和参数来源不同,直接影响类型判断结果。比如 scene('edit') 可能跳过某些字段,而 scene('create') 强制要求 status 是 integer,但如果你传了 "0",验证仍通过——因为 in:0,1,2 这类规则不关心类型。
本文共计1060个文字,预计阅读时间需要5分钟。
很多人以为只要写了以下内容:
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 在验证规则里加
'type' => 'integer'(仅 TP6.1+ 支持),但注意它只校验 PHP 类型,不处理自动转换 - 更可靠的做法:先用
input()拿原始值,再用intval()/floatval()/(int)显式转换,然后和原始字符串比对是否“无损” - 例如判断是否纯整数:
$raw = $this->request->param('id'); $num = (int)$raw; if ((string)$num !== $raw) { // 类型不一致 }
TP6 中 Validate 类的 rule 与 scene 对类型校验的影响
场景不同,校验时机和参数来源不同,直接影响类型判断结果。比如 scene('edit') 可能跳过某些字段,而 scene('create') 强制要求 status 是 integer,但如果你传了 "0",验证仍通过——因为 in:0,1,2 这类规则不关心类型。

