ThinkPHP3.0完全开发手册
新版的ThinkPHP具有字段类型检测,对于不合法的字段数据会进行强制转换。字段类型检测可以用于数据写入和数据查询操作。
需要启用字段类型检测的话,需要在配置文件中开启DB_FIELDTYPE_CHECK参数:
'DB_FIELDTYPE_CHECK'=>true, // 开启字段类型验证
如果在非调试模式下面开启字段类型检测后,请清空字段缓存目录(位于Runtime/Data/_fields/),重新生成字段缓存的时候,会在缓存文件中记录字段的类型信息。这是后面进行字段类型检测的前提。
字段类型检测主要在两个阶段会自动处理:
一、在数据写入到数据库之前
例如:
$User = M("User"); // 实例化User对象
// 然后直接给数据对象赋值
$User->name = 'ThinkPHP';
$User->score = '2ThinkPHP';
// 把数据对象添加到数据库
$User->add();
由于用户表的score设计的是数字类型,所以实际写入数据库之前,score属性的值已经被强制进行intval转换了,模型的save方法也会同样进行字段类型检查。虽然在很多情况下,数据库本身也会进行数据转换,但是对于某些数据库要求严格检查数据类型的情况会有帮助。
二、在使用数组方式的普通查询条件后
例如:
$User = M("User"); // 实例化User对象
$condition['id'] = '1 OR 1=1';
// 把查询条件传入查询方法
$User->where($condition)->select();
对于这样的一个查询条件,在进行数据库查询之前,会对查询的数组条件进行字段类型检查,直接就把id的值强制转换为1然后再进行查询操作。
即使不进行强制转换,系统也会进行安全过滤,把这样的非法数据进行转义,区别在于这样对于数据库更加安全,对于某些数据库要求严格检查数据类型的情况会有帮助。