小心使用ThinkPHP中的addAll方法

php中文网
发布: 2016-06-20 12:30:54
原创
1723人浏览过

作者在项目里写一个简单的创建问题接口时,一不小心就踩到了thinkphp的两个坑。将它称之为坑,实则是对文档的不熟悉。接口代码如下:

public function createProblems(){    $problems = I('json.');    if (empty($problems)) {        $this->error($problems, 'json格式不符合规范');    }    foreach ($problems as $problem) {        $data = D('Problem')->create($problem, self::OP_INSERT);        if (!$data) {            $this->error($problem, D('Problem')->getError());        }        $temp[] = $data;    }    $ret = D('Problem', 'Service')->addProblems($temp);    if ($ret === false) {        $this->error(null, '导入失败');    }    $this->success(null);}
登录后复制

接口完成的功能是批量创建问题,参数为json数组,addProblem()方法中就是一个addAll操作。

第一个坑-自动填充

使用自动填充可能会覆盖表单提交项目。其目的是为了防止表单非法提交字段。使用Model类的create方法创建数据对象的时候会自动进行表单数据处理。

官方文档明确说了自动填充会覆盖表单,所以即使你post过来的参数中给出了具体数值,使用create方法之后也可能会被覆盖。千万注意!!!

第二个坑-addAll方法

addAll方法中不能出现null值,否则其他数据会自动向前移动,导致添加失败。举例:

[    {        "appId": 1,        "serviceId": 2,        "createUser":null,        "status": 1,        "priority": 2    }]
登录后复制

其中,createUser字段为null,插入时的sql语句会变成insert into va_problem (appId, serviceId, createUser, status, priority)values (1, 2, 1, 2)。null值没了,导致插入失败,这应该是ThinkPHP3.2.3的一个bug。这篇博客有相关的讨论。

立即学习PHP免费学习笔记(深入)”;

百度文心百中
百度文心百中

百度大模型语义搜索体验中心

百度文心百中 22
查看详情 百度文心百中

引入坑的过程

problemModel里面有对createUser做自动填充。

通过api创建问题时,首先自动填充会覆盖,所以表单中的createUser值失效,这是第一个坑。然后,由于自动填充createUser调用的是get_username()函数,通过api调用时,session(username)取不到值,所以create之后字段变成"createUser":null,引入了第二个坑。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号