thinkphp l方法 使用create方法怎么使用

ThinkPHP中的create方法与自动令牌验证
user表结构
id username password
\aoli\Home\Tpl\default\User\create.html
action="__URL__/addit" method="post"&
& &input type="text" name="id"
& &input type="text"
name="username" /&
& &input type="password"
name="password" /&
& &input type="submit" name="sub"
value="提交" /&
\aoli\Home\Lib\Action
& class UserAction extends Action {&&&
function create(){
$this-&display();&&&
&function addit(){
//向表user中添加表单内容
$user=M('user');
$user-&create();
$user-&add();
&& //判断是否存在令牌验证
&if(!$user-&autoCheckToken($_POST)){
&&&&&&&&&&&&
dump('no');&&
dump('yes');&&&
1、在对表单提交过来的数据进行操作之前,我们往往需要手动创建需要的数据,例如上面提交的表单数据:
& //实例化User模型
$user=M('user');
& //获取表单的POST数据
$data['username']=$_POST['username']
$data['password']=$_POST['password']
& //写入到数据库
$user-&data($data)-&add();
附:使用data方法创建的数据对象不会进行自动验证和过滤操作,需要自行处理,如果只是想简单创建一个数据对象,并且不需要完成一些额外的功能的话,可以使用data方法简单的创建数据对象。
2、ThinkPHP可以帮助我们快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象。create方法创建的数据对象是保存在内存中的,并没有实际的写入到数据库中。
//实例化user模型
$user=M('user');
//根据表单提交的POST数据创建数据对象,并保存在内存中,可以通过dump($user)查看
$user=create();
//把创建的数据对象写入数据库中
$user-&add();
3、create方法支持从其它方式创建数据对象,如,从其它的数据对象或者数组等。
$data['name']='ThinkPHP';
$data['eamil']='';
$user-&create($data);
甚至还可以支持从对象创建新的数据对象,如从user数据对象创建新的member数据对象
$user=M('user');
$user-&find(1);
$member=M('member');
$member-&create($user);
4、create方法在创建数据对象的同时,还完成了一些很有意义的工作,包括令牌验证、数据自动验证、字段类型查找,数据自动完成等。
因些,我们熟悉的令牌验证、自动验证和自动完成功能,其实都必须通过create方法才能生效。
5、令牌验证:
&& 功能:可以有效防止表单的远程提交等安全防护。
&& config.php中添加如下配置:
'TOKEN_ON'&&&&
=&&& true,
//是否开启令牌验证
'TOKEN_NAME'&&
=&&& 'token',//
令牌验证的表单隐藏字段名称
'TOKEN_TYPE'&&
'md5',//令牌验证哈希规则
自动令牌会向当前SESSION会话当中放上一个md5加密的字符串。并将这个字符串以隐藏域的形式插入到表单的form之前。这个字符串出现在两个地方,一个是在SESSION当中,另一个就是在表单当中。当你提交表单后,服务器第一件事就是对比这个SESSION信息,如果正确的话,准许表单提交,否则不允许提交。
查看create.html的的源代码会看到在表单form的结束标志之前会多了一个自动生成的隐藏域
&input type="hidden" name="token" value="eef419c3d14c9c93caa7627eedaba4a5" /&
(1)、如果希望自己控制隐藏域的位置,可以手动在表单页面添加 {__TOKEN__} 标识,系统会在输出模板的时候自动替换。
(2)、如果在开启表单令牌验证的情况下,个别表单不需要使用令牌验证
功能,可以在表单页面添加 {__NOTOKEN__} ,则系统会忽略当前表单的令牌验证。
(3)、如果页面中存在多个表单,建议添加 {__TOKEN__} 标识,并确保只有一个表单需要令牌验证。
(4)、如果使用create方法创建数据对象的话,会同时自动进行表单验证,如果没有使用该方法的话,则需要手动调用模型的autoCheckToken方法进行表单验证。
(!$User-&autoCheckToken($_POST)){
令牌验证错误
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。写这篇随笔之前,我明显陷入了一个令我几乎放弃的想法:手册上讲的非常详细,网上的例子讲解多的一塌糊涂,我凭借并不精熟的技能经验写这个东西,贻笑大方是一,有什么用处是二。这个想法在我的脑海里不断的闪现,以至于我的例子其实写好很久,但是迟迟没有动手写博文。终于,今天上班路上,不断纠结的我想明白一件事:我写的所有的东西并不是去指导别人怎么样,更不是为了展示我的技术怎么样。我在博客园开博最重要的是让自己得到历练,让自己有坚持完成一个完整的,比较漂亮的个人项目。获取,它的设计很丑陋,或许,它的逻辑很简单。但是,一步步敲击起来的过程才是我想要的东西。我需要坚持。
&CURD分别是create,update,read,delete的缩写,对数据的CURD是php的最基本的操作。tp封装了很好的curd操作方法。下面,我将展示我的user模块的相关curd操作。&至于之前说的rbac权限控制还需要过段时间。
首先,建立用户表的数据结构:
然后,在tp的Conf目录下定义相关的数据库配置项,可以从ThinkPHP的核心包下的Common/convention.php下找到相关配置项,然后根据自己的实际情况加以修改。之前说过,我用的是sea版本的tp核心包,数据库的配置sea已经定义好,不许额外配置。
然后,在项目目录下的lib/Action/下建立相关的action:此处建立UserAction.class.php。在这个文件下分别定义一下方法。
&1&class&UserAction&extends&Action{
&2&//记录列表 & &read
&3&public&function&index(){}
&4&//新增记录 & &create
&5&public&function&add(){}
&6&//编辑记录 & &update
&7&public&function&edit(){}
&8&//删除记录 & &delete
&9&public&function&delete(){}
&上面分别定义了curd对应的操作。下面,具体实现着四个方法。
&首先,create操作。
&1&public&function&add()&{&&&&&//用户新增&&
&2if(!checkLogin())
&3&&&&&&&&&&&&&die("&script&alert('尚未登录,请登录');window.location.href='?m=user&a=login'&/script&");
&4&&&&&&&&&if($_POST['submit']){
&5&&&&&&&&&&&&&$user&= M('User');
&6&&&&&&&&&&&&&if($user-&create()){
&7&&&&&&&&&&&&&&&&&$res&=&$user-&add();
&8&&&&&&&&&&&&&&&&&if($res)
&9&&&&&&&&&&&&&&&&&&&&&echo&"&script&alert('插入成功');&/script&";
10&&&&&&&&&&&&&&&&&else
11&&&&&&&&&&&&&&&&&&&&&echo&"&script&alert('插入失败');&/script&";
12&&&&&&&&&&&&&}else{
13&&&&&&&&&&&&&&&&&echo&$user-&getError();
14&&&&&&&&&&&&&}
15&&&&&&&&&}
16&&&&&&&&&$this-&display();
ThinkPHP提供了一个自动填充方法,create方法,通过使用这个方法,tp可以自动将表单提交的数据中与数据表中字段名相匹配的数据自动填充中实例化的对象中然后使用tp提供的add方法插入数据库中。$user&=&M('User')是对模型的快速实例化,用M方法可以不用预先定义model,与$model = new Model();一个意思。至于create方法可以使用$user-&username = $_POST['username']这样的形式来进行填充。不过,create方法除了填充外还会自动验证表单数据,可以极大提高效率。这部分以后会涉及。
然后,UPDATE方法
&1&public&function&edit(){&&&&&//用户编辑
&2&&&&&&&&&if(!checkLogin())
&3&&&&&&&&&&&&&die("&script&alert('尚未登录,请登录');window.location.href='?m=user&a=login'&/script&");
&4&&&&&&&&&$user&=&D('User');
&5&&&&&&&&&$id&=&$_GET['id'];
&6&&&&&&&&&if($id){
&7&&&&&&&&&&&&&$userinfo&=&$user-&select($id);
&8&&&&&&&&&}
&9&&&&&&&&&if(isset($_POST['submit'])&&&&!empty($_POST['submit'])){
10&&&&&&&&&&&&&if($user-&create()){
11&&&&&&&&&&&&&&&&&$user-&where("userid&=&$id")-&save();
12&&&&&&&&&&&&&}else{
13&&&&&&&&&&&&&&&&&echo&$user-&getError();
14&&&&&&&&&&&&&}
15&&&&&&&&&}
16&&&&&&&&&$this-&model&=&$userinfo[0];
17&&&&&&&&&$this-&display();&
18&&&&&}&&
这个方法与add方法相似,不过,预先会传入相关参数先通过select方法选出对应数据展示在view层,后面跟add原理相同
然后,READ操作
&&1&public&function&index()&{&&&//用户列表
&2&&&&&&&&&if(!checkLogin())
&3&&&&&&&&&&&&&die("&script&alert('尚未登录,请登录');window.location.href='?m=user&a=login'&/script&");
&4&&&&&&&&&$user&=&D('User');
&5&&&&&&&&&$fields&=&array('userid',&'username',&'nickname',&'password');
&6&&&&&&&&&$map['active']&=&array('eq',&1);
&7&&&&&&&&&$userinfo&=&$user-&field($fields)-&where($map)-&select();
&8&&&&&&&&&$this-&userinfo&=&$userinfo;
&9&&&&&&&&&$this-&display();
这个方法里使用了select方法,查询应该是php与数据库交互中用的最多的。tp的curd操作往往跟连贯操作相关联使用。常用的连贯操纵有where,table,field,data,order,limit,page,group,having,join,district,lock等,使用这些方法的实质就是凭借sql语句。
最后,DELETE操作。
&1&public&function&del()&{&&&&&//用户删除
&2&&&&&&&&&if(!checkLogin())
&3&&&&&&&&&&&&&die("&script&alert('尚未登录,请登录');window.location.href='?m=user&a=login'&/script&");
&4&&&&&&&&&$user&=&D('User');
&5&&&&&&&&&$id&=&$_GET['id'];
&6&&&&&&&&&if($id){
&7&&&&&&&&&&&&&$user-&delete($id);
&8&&&&&&&&&&&&&echo&"&script&alert('删除成功');window.location.href='?m=User'&/script&";
&9&&&&&&&&&}
&删除操作就是把参数传递过来然后执行delete操作。跟原生的php一样,删除操作时数据库操作中需要极其谨慎的。
&先简要的描述一下curd的相关操作,这部分是tp来自php的基础,还是在实际使用的时候才看得出他们的意义。
阅读(...) 评论()ThinkPHP 表单数据智能写入 create 方法 - ThinkPHP教程 - 自习教室
ThinkPHP 表单数据智能写入 create 方法
创建数据对象 create()除了手动构造入库的数据集之外,ThinkPHP 还提供了自动创建数据对象的 create() 方法。create() 方法将自动收集
创建数据对象 create()
除了手动构造入库的数据集之外,ThinkPHP 还提供了自动创建数据对象的 create() 方法。create() 方法将自动收集提交的表单数据并创建数据对象而无需人工干预,这在表单
数据字段非常多的情况下更具优势。
将前文写入表单数据的例子用 create() 来实现:
public&function&insert2(){&
header(&Content-Type:text/&charset=utf-8&);&
$Dao&=&M(&User&);&
if($Dao-&create()){&
$Dao-&password&=&md5($_POST[&password&]);&
$Dao-&regdate&=&time();&
if($lastInsId&=&$Dao-&add()){&
echo&&插入数据&id&为:$lastInsId&;&
echo&&数据写入错误!&;&
exit($Dao-&getError().'&[&&a&href=&:history.back()&&返&回&/a&&]');&
create() 创建数据对象后,将自动收集提交过来的表单数据。而表单数据可能需要经过一定加工(例如将密码加密)才能写入数据表,所以可以对数据对象的成员属性值根据进行
修改或添加去除等。
提示:create() 创建的数据对象存放于内存,在执行入库动作(add() 或 save())之前,都可以进行修改。
在上面的例子里,create()方法 的行为和 date()方法 是一致。但 date() 方法只是简单的创建数据对象,但 create() 方法还具备:
数据自动验证
字段映射支持
字段类型检查
数据自动完成
等各种高级的数据功能,要完成这些高级数据模型功能,需要使用 D方法 实例化数据模型。ThinkPHP 提供了各种验证与填充规则供调用,具体可参见《ThinkPHP 自动验证》与《
ThinkPHP 自动填充》。
自动验证与自动填充
在将表单写入数据表之前,常常会有一些对数据的检测(提交的用户名是否符合要求)与处理(如例子中的密码加密以及取得当前时间戳)。create() 方法就支持数据的自动验证
与自动完成。
在 LibModel 目录下创建 UserModel.class.php 文件(User 为创建的模型对象,也对应 前缀_user 表),加入自动验证和自动填充规则:
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 操作更改为:
public&function&insert2(){&
header(&Content-Type:text/&charset=utf-8&);&
$Dao&=&D(&User&);&
if($Dao-&create()){&
if($lastInsId&=&$Dao-&add()){&
echo&&插入数据&id&为:$lastInsId&;&
echo&&数据写入错误!&;&
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)
相关热词搜索:
频道总排行
频道本月排行

我要回帖

更多关于 thinkphp create 的文章

 

随机推荐