create()方法详解

2019-08-12 14:43:35 浏览数 (1)

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)

0 人点赞