thinkphp中神奇的create()方法

时间:2022-10-15 00:07:29

正常的表单提交会把所有的表单数据提交上来

$data = $_POST;
print_r($data);exit;

结果

Array ( [status] => 1 [comment] => 啊啊啊 [id] => 16 [submit] => 提交 )

而用create()方法处理,

$data = $userApplicantsModel->create(); // 把无用的都顾虑掉了
print_r($data);exit;

结果

Array ( [status] => 1 [comment] => 啊啊啊 [id] => 16 )

只留下跟数据表相关的字段

这样就可以处理数据到数据库了,省心

全部代码

/**** 商户申请审核 ****/
public function checkApplicants(){
$id = $this->_request('id','trim',0);
$userApplicantsModel = M('User_applicants');
$applicantsData = $userApplicantsModel->where(array('id'=>$id))->find();
if(is_null($applicantsData)){
$this->error('记录不存在');
}
if($this->_post('submit','isset')){ // 判断表单提交
$data = $userApplicantsModel->create(); // 把无用的都顾虑掉了$res = $userApplicantsModel->save($data);
if($res!==false){
// 操作成功
$this->success('修改成功!', U('User/applicants'));
}
}else{
$this->assign('data', $applicantsData);
$this->display();
}
}

追踪到源代码,如下

 /**
* 创建数据对象 但不保存到数据库
* @access public
* @param mixed $data 创建数据
* @param string $type 状态
* @return mixed
*/
public function create($data='',$type='') {
// 如果没有传值默认取POST数据
if(empty($data)) {
$data = $_POST;
}elseif(is_object($data)){
$data = get_object_vars($data);
}
// 验证数据
if(empty($data) || !is_array($data)) {
$this->error = L('_DATA_TYPE_INVALID_');
return false;
} // 检查字段映射
$data = $this->parseFieldsMap($data,0); // 状态
$type = $type?$type:(!empty($data[$this->getPk()])?self::MODEL_UPDATE:self::MODEL_INSERT); // 检测提交字段的合法性
if(isset($this->options['field'])) { // $this->field('field1,field2...')->create()
$fields = $this->options['field'];
unset($this->options['field']);
}elseif($type == self::MODEL_INSERT && isset($this->insertFields)) {
$fields = $this->insertFields;
}elseif($type == self::MODEL_UPDATE && isset($this->updateFields)) {
$fields = $this->updateFields;
}
if(isset($fields)) {
if(is_string($fields)) {
$fields = explode(',',$fields);
}
foreach ($data as $key=>$val){
if(!in_array($key,$fields)) {
unset($data[$key]);
}
}
} // 数据自动验证
if(!$this->autoValidation($data,$type)) return false; // 表单令牌验证
if(C('TOKEN_ON') && !$this->autoCheckToken($data)) {
$this->error = L('_TOKEN_ERROR_');
return false;
} // 验证完成生成数据对象
if($this->autoCheckFields) { // 开启字段检测 则过滤非法字段数据
$fields = $this->getDbFields();
foreach ($data as $key=>$val){
if(!in_array($key,$fields)) {
unset($data[$key]);
}elseif(MAGIC_QUOTES_GPC && is_string($val)){
$data[$key] = stripslashes($val);
}
}
} // 创建完成对数据进行自动处理
$this->autoOperation($data,$type);
// 赋值当前数据对象
$this->data = $data;
// 返回创建的数据以供其他调用
return $data;
}

这里有个过滤非法字段功能,估计跟它有关系

thinkphp中神奇的create()方法的更多相关文章

  1. thinkphp中AJAX返回ajaxReturn()方法分析

    本文分析了thinkphp中AJAX返回ajaxReturn()方法.分享给大家供大家参考,具体如下: 系统支持任何的AJAX类库,Action类提供了ajaxReturn方法用于AJAX调用后返回数 ...

  2. thinkphp中获取参数值的方法

    以获取$type这个参数为例:一:通过传统方法:$_GET, $_POST    $type = intval($_GET['type'])这种方法需要自己写过滤规则,保证数据安全. 二:在Actio ...

  3. ThinkPHP中add()方法的返回值

    在处理业务数据的时候,有时会遇到需要取得刚insert的数据的主键id值. 以前的做法都是先插入数据后,再通过查询获得id值. 后来在学习ThinkPHP开发的时候才知道,add()方法在写入成功后得 ...

  4. thinkphp中的分表方法

    public function getPartitionTableName($data=array()) { // 对数据表进行分区 if(isset($data[$this->partitio ...

  5. ThinkPHP中的统计查询方法

    • count() 表示查询表中总的记录数 • max() 表示查询某个字段的最大值 • min() 表示查询某个字段的最小值 • avg() 表示查询某个字段的平均值 • sum() 表示求出某个字 ...

  6. thinkphp中 select() 和find() 方法的区别

    $about=M('document'); $abouts=$about->where('id=2')->select(); $abouts2=$about->where('id=2 ...

  7. thinkphp中setInc、setDec方法

    可用于统计字段(通常是数字类型的字段)的更新,例如积分,等级,登陆次数等 必须配合连贯操作where一起使用   score 是数据库指定的某个字段 $User = M("User&quot ...

  8. thinkphp中的setInc、setDec方法

    thinkphp中setInc.setDec方法 可用于统计字段(通常是数字类型的字段)的更新,例如积分,等级,登陆次数等 必须配合连贯操作where一起使用 $User = M("User ...

  9. thinkphp中的Ueditor的使用, 以及如何传递编辑器内容到后台?

    在线编辑器有很多很多, 而且大多是开源的. uediotr基于mit协议, 开源, 可以用于商业和非商业的 任意使用和修改都可以 如果两个相连接的 相邻的 元素之间 因为边框重叠 而显得中间的边框线很 ...

随机推荐

  1. 配置linux----------------ip

    在终端中输入 vi /etc/sysconfig/network-scripts/ifcfg-eth0 =================================== DEVICE=&quot ...

  2. DBlink与同义词

    DBLink就是数据库链接,而同义词就已经具体到某个用户下的表了 原文链接:http://www.linuxidc.com/Linux/2013-01/77579.htm 这里所需要的信息: 从MM库 ...

  3. cube定时器延时不准确原因

    昨天晚上测试32cube配置好定时器,以1ms为一次中断,然后在程序中做了一个1s的延时,结果发现实际延时5s左右,百思不得其解,仔细查看cube配置也没问题.最后我打开生成工程文件夹里面的ioc文件 ...

  4. getEl mask 用法

  5. 某个系统配置文件 用户层的SQL

    SELECT fpo.user_profile_option_name, fpv.level_id, fpv.level_value, fpv.profile_option_value, fu.use ...

  6. 深入了解当前ETL中用到的一些基本技术

    数据集成是把不同来源.格式和特点的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享,是企业商务智能.数据仓库系统的重要组成部分.ETL是企业数据集成的概念出发,简要分析了当前ETL中用到的 ...

  7. java多线程关键字volatile、lock、synchronized

    --------------------- 本文来自 旭日Follow_24 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/xuri24/article/detail ...

  8. python 字符串格式化,使用f前缀

    格式化一般用%,但后来推荐用format format有进步,可以用索引或者名字,但仍然没有很方便和快捷 # logger.debug('{} {} {} {} {} {}'.format(metho ...

  9. 【Visual Studio】切换版本控制工具插件

    需求:安装了VS的某些版本控制工具的插件(比如Svn的插件AnkhSvn),但是打开VS后依然使用的是默认的版本控制工具,想要切换. Tool –> Options –> Source C ...

  10. Linux命令之乐--seq

    用法及参数:  -f, --format=格式      使用printf 样式的浮点格式,默认是g%  -s, --separator=字符串     使用指定字符串分隔数字(默认使用:\n)  - ...