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 相关文章推荐
信用卡效验程序
Oct 09 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
php格式化金额函数分享
Feb 02 PHP
php实现ip白名单黑名单功能
Mar 12 PHP
typecho插件编写教程(五):核心代码
May 28 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 PHP
PHP支付宝当面付2.0代码
Dec 21 PHP
实例讲解php实现多线程
Jan 27 PHP
php下的原生ajax请求用法实例分析
Feb 28 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 strtr() 函数使用说明
2008/11/21 PHP
php共享内存段示例分享
2014/01/20 PHP
学习php设计模式 php实现工厂模式(factory)
2015/12/07 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
JS加jquery简单实现标签元素的显示或隐藏
2013/09/23 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
node.js中的fs.openSync方法使用说明
2014/12/17 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
jQuery EasyUI Tab 选项卡问题小结
2016/08/16 Javascript
javascript实现简单的on事件绑定
2016/08/23 Javascript
用ES6写全屏滚动插件的示例代码
2018/05/02 Javascript
Node.js控制台彩色输出的方法与原理实例详解
2019/12/01 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[04:22]DOTA2上海特级锦标赛主赛事第四日TOP10
2016/03/06 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
Python描述器descriptor详解
2015/02/03 Python
python判断字符串编码的简单实现方法(使用chardet)
2016/07/01 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python中模块查找的原理与方法详解
2017/08/11 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
解决Python 使用h5py加载文件,看不到keys()的问题
2019/02/08 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
Pytorch 实现数据集自定义读取
2020/01/18 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
基于python实现复制文件并重命名
2020/09/16 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
学校食堂采购员岗位职责
2013/12/05 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
民政局个人整改措施
2014/09/24 职场文书
教师个人成长总结
2015/02/11 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
高一作文之暖冬
2019/11/09 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python