create() 方法将自动收集提交的表单数据并创建数据对象而无需人工干预,这在表单数据字段非常多的情况下更具优势。
create() 创建数据对象后,将自动收集提交过来的表单数据。而表单数据可能需要经过一定加工(例如将密码加密)才能写入数据表,所以可以对数据对象的成员属性值根据进行修改或添加去除等。
提示:create() 创建的数据对象存放于内存,在执行入库动作add() 或 save()之前,都可以进行修改。
create() 方法还具备:
① 令牌验证 ② 数据自动验证 ③ 字段映射支持 ④ 字段类型检查 ⑤ 数据自动完成
1.create方法可以对POST提交的数据进行处理(通过表中的字段名称与表单提交的名称一一对应关系自动封装数据),例如
user表中有一个字段名叫"username",
如果表单中有一个<input name="username" value="小明">,
那么$User = M('User'); $data = $User->create(); echo $data['username'];
就会输出"小明",不用你用$_POST['username']去接收。
若form和表的字段无对应关系,则
html:
<input name="less" type="text"/> <br> <input name="name" type="text"/><br> <input name="savename" type="password"/><br>
php:
$data = $docs->create(); dump($data); dump($_POST);
结果:$data只会记录和数据库字段对应的数据,非数据库字段自动忽略。
代码语言:javascript复制array(2) {
["name"] => string(5) "admin"
["savename"] => string(6) "123456"
}
代码语言:javascript复制array(4) {
["less"] => string(0) "" //在$data中被过滤掉了
["name"] => string(5) "admin"
["savename"] => string(6) "123456"
["sub"] => string(6) "鎻愪氦"
}
# 如果create带参数$input,则form数据不存在。create只有input数据
$input['name'] = 'ThinkPHP'; $data = $docs->create($input); dump($data);
2.用create方法可以对表单进行令牌验证,防止表单重复提交。
3.可以对数据自动验证,前提是你必须手动在Model文件夹中建立一个UserModel.class.php文件,在其中加入验证规责 protected $_validate = array( array('username','require','用户名必须', 1), );
4.可以对字段自动赋值,前提还是必须手动在Model文件夹中建立一个UserModel.class.php文件,在其中加入 protected $_auto = array( array('create_time','time',self::MODEL_INSERT,'function'), ); 那么user的注册时间将自动赋值为当前时间
最大的作用是自动获取表单数据并完成一系列的操作和过滤(通过自动验证、自动完成、令牌验证等等)。
create方法创建的数据对象是保存在内存中的,并没有实际的写入到数据库中。
代码语言:javascript复制//实例化user模型
$user=M('user');
//根据表单提交的POST数据创建数据对象,并保存在内存中,可以通过dump($user)查看
$user=create();
//把创建的数据对象写入数据库中
$user->add();
3、create方法支持从其它方式创建数据对象,如,从其它的数据对象或者数组等。
$data['name']='ThinkPHP';$data['eamil']='ThinkPHP@gmail.com';$user->create($data); 甚至还可以支持从对象创建新的数据对象,如从user数据对象创建新的member数据对象$user=M('user');$user->find(1);$member=M('member');$member->create($user); |
---|
自动验证与自动填充
在将表单写入数据表之前,常常会有一些对数据的检测(提交的用户名是否符合要求)与处理(如例子中的密码加密以及取得当前时间戳)。create() 方法就支持数据的自动验证与自动完成。
在 LibModel 目录下创建 UserModel.class.php 文件(User 为创建的模型对象,也对应 前缀_user 表),加入自动验证和自动填充规则:
代码语言:javascript复制class UserModel extends Model{
// 自动验证设置
protected $_validate = array(
array('username','require','用户名必须填写!',1),
array('email','email','邮箱格式错误!',2),
array('username','','用户名已经存在!',0,'unique',1),
);
//自动填充设置
protected $_auto = array(
array('regdate','time',self::MODEL_INSERT,'function'),
array('password','md5',self::MODEL_INSERT,'function'),
);
}
将 insert2 操作更改为:
代码语言:javascript复制public function insert2(){
header("Content-Type:text/html; charset=utf-8");
$Dao = D("User");
if($Dao->create()){
if($lastInsId = $Dao->add()){
echo "插入数据 id 为:$lastInsId";
} else {
echo "数据写入错误!";
}
}else{
exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]');
}
}
如果提交的数据不符合验证要求(如用户名存在),则 create() 创建数据对象失败(返回 FALSE ),$Dao->getError() 会打印出自动验证设置规则里面设置的提示信息:用户名已经存在!
如果验证规则通过后,系统会进行自动填充设置,将表单密码进行 MD5 加密以及取得当前的时间戳填充入 create() 的数据对象。
所以 D方法 配合 create() 是非常智能而强大的,恰当运用可以达到事半功倍快速开发的目的。
提示:
① D 方法配合 create() 由于其功能强大,也就损失了一定的效率,在业务逻辑不复杂的情况下推荐 M方法 data() 模式
② create() 默认接受 POST 数据,若要接受其他类型数据,只需在参数内指定即可,如接受 GET 数据:create($_GET)