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完全过滤HTML,JS,CSS等标签
Jan 16 PHP
php下载文件的代码示例
Jun 29 PHP
提高php运行速度的一些小技巧分享
Jul 03 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
Apr 10 PHP
PHP答题类应用接口实例
Feb 09 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
教你在PHPStorm中配置Xdebug
Jul 27 PHP
PHP上传图片类显示缩略图功能
Jun 30 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP下载文件函数与用法示例
Sep 27 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
golang 调用 php7详解及实例
2017/01/04 PHP
在 Laravel 6 中缓存数据库查询结果的方法
2019/12/11 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
javascript Window及document对象详细整理
2011/01/12 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
使用Chrome调试JavaScript的断点设置和调试技巧
2014/12/16 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
学习Javascript面向对象编程之封装
2016/02/23 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
浅谈JS继承_寄生式继承 &amp; 寄生组合式继承
2016/08/16 Javascript
微信小程序 省市区选择器实例详解(附源码下载)
2017/01/05 Javascript
canvas实现十二星座星空图
2017/02/14 Javascript
js实现旋转木马效果
2017/03/17 Javascript
nodejs中解决异步嵌套循环和循环嵌套异步的问题
2017/07/12 NodeJs
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
[02:35]DOTA2超级联赛专访XB 难忘一年九冠称王
2013/06/20 DOTA
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python字符串string的内置方法实例详解
2018/05/14 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
如何优雅地改进Django中的模板碎片缓存详解
2018/07/04 Python
python3 pygame实现接小球游戏
2019/05/14 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
2019/06/05 Python
python自动识别文本编码格式代码
2019/12/26 Python
Python3 操作 MySQL 插入一条数据并返回主键 id的实例
2020/03/02 Python
Python使用tkinter实现摇骰子小游戏功能的代码
2020/07/02 Python
用CSS3实现Win8风格的方格导航菜单效果
2013/04/10 HTML / CSS
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
Lovedrobe官网:英国领先的大码服装品牌
2019/09/19 全球购物
优秀毕业大学生推荐信
2013/11/13 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
2016大学生入党积极分子心得体会
2016/01/06 职场文书
商业计划书格式、范文
2019/03/21 职场文书
给numpy.array增加维度的超简单方法
2021/06/02 Python