ThinkPHP中的create方法与自动令牌验证实例教程


Posted in PHP onAugust 22, 2014

本文实例形式展示了ThinkPHP中的create方法与自动令牌验证的实现方法,具体步骤如下:

一、数据表结构

user表结构如下:

id username password

二、view模板部分

\aoli\Home\Tpl\default\User\create.html页面如下:

<form 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="提交" />
</form>

三、action部分:

\aoli\Home\Lib\Action.php页面如下:

<?php
 class UserAction extends Action {
  function create(){
     $this->display();   
   }
   
   function addit(){
     //向表user中添加表单内容
     $user=M('user');
     $user->create();
     $user->add();
     //判断是否存在令牌验证
     if(!$user->autoCheckToken($_POST)){
       dump('no'); 
     }else{
       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']='ThinkPHP@gmail.com';
   $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方法进行表单验证。

if (!$User->autoCheckToken($_POST)){
// 令牌验证错误
}

希望本文所示实例对大家的ThinkPHP程序设计有所帮助。

PHP 相关文章推荐
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
PHP 事件机制(2)
Mar 23 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
yii权限控制的方法(三种方法)
Dec 28 PHP
smarty中改进truncate使其支持中文的方法
May 30 PHP
PHP编写简单的App接口
Aug 28 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
thinkPHP js文件中U方法不被解析问题的解决方法
Dec 05 PHP
php结合redis高并发下发帖、发微博的实现方法
Dec 15 PHP
使用php自动备份数据库表的实现方法
Jul 28 PHP
PHP实现的防止跨站和xss攻击代码【来自阿里云】
Jan 29 PHP
如何优雅的使用 laravel 的 validator验证方法
Nov 11 PHP
ThinkPHP基本的增删查改操作实例教程
Aug 22 #PHP
ThinkPHP自动填充实现无限级分类的方法
Aug 22 #PHP
ThinkPHP验证码和分页实例教程
Aug 22 #PHP
ThinkPHP文件上传实例教程
Aug 22 #PHP
ThinkPHP中ajax使用实例教程
Aug 22 #PHP
ThinkPHP中的常用查询语言汇总
Aug 22 #PHP
ThinkPHP多语言支持与多模板支持概述
Aug 22 #PHP
You might like
一个php作的文本留言本的例子(六)
2006/10/09 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
php使用cookie实现记住登录状态
2015/04/27 PHP
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
js实现弹窗居中的简单实例
2016/10/09 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
使用异步controller与jQuery实现卷帘式分页
2019/06/18 jQuery
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
Python自动化测试Eclipse+Pydev 搭建开发环境
2016/08/15 Python
Python hashlib模块用法实例分析
2018/06/12 Python
python网络应用开发知识点浅析
2019/05/28 Python
Python实现的远程文件自动打包并下载功能示例
2019/07/12 Python
python集合能干吗
2020/07/19 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
Pottery Barn阿联酋:购买家具、家居装饰及更多
2019/12/08 全球购物
什么是事务?为什么需要事务?
2012/01/09 面试题
大专生自我鉴定范文
2013/10/01 职场文书
办公室前台的岗位职责
2013/12/20 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
运动会方队口号
2014/06/07 职场文书
企业文化标语大全
2014/06/10 职场文书
宿舍标语大全
2014/06/19 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
数学复习课教学反思
2016/02/18 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js
微信小程序纯CSS实现无限弹幕滚动效果
2022/09/23 HTML / CSS