前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >create()方法详解

create()方法详解

作者头像
PM吃瓜
发布2019-08-12 14:43:35
2K0
发布2019-08-12 14:43:35
举报
文章被收录于专栏:PM吃瓜(公众号)PM吃瓜(公众号)

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)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Tech爬虫 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档