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 include,include_once,require,require_once
Sep 05 PHP
PHP学习笔记之三 数据库基本操作
Jan 17 PHP
PHP迭代器实现斐波纳契数列的函数
Nov 12 PHP
php 使用GD库为页面增加水印示例代码
Mar 24 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
PHP使用内置函数生成图片的方法详解
May 09 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
PHP7.1新功能之Nullable Type用法分析
Sep 26 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
TP5.0框架实现无限极回复功能的方法分析
May 04 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中数组合并的两种方法及区别介绍
2012/09/14 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
PHP将进程作为守护进程的方法
2015/03/19 PHP
JavaScript 学习小结(适合新手参考)
2009/07/30 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
uploadify多文件上传参数设置技巧
2015/11/16 Javascript
JavaScript 基础函数_深入剖析变量和作用域
2016/05/18 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
jQuery Ajax前后端使用JSON进行交互示例
2017/03/17 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
JS中Object对象的原型概念基础
2018/01/29 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
Django contenttypes 框架详解(小结)
2018/08/13 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
pytorch 自定义数据集加载方法
2019/08/18 Python
Python 解析简单的XML数据
2020/07/24 Python
Python Matplotlib简易教程(小白教程)
2020/07/28 Python
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
批评与自我批评材料
2014/02/15 职场文书
《英英学古诗》教学反思
2014/04/11 职场文书
房产转让协议书(2014版)
2014/09/30 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python
Pyhton模块和包相关知识总结
2021/05/12 Python
深入理解pytorch库的dockerfile
2022/06/10 Python