版本3.2.3

1、数据库操作中的连贯操作table(),在查询的时候可以切换表,但是在插入,更新的时候请不要使用。例如

D('user')->table('auth')->add($data);

操作会出问题,因为插入的时候会把非user表的字段删除

2.数据库操作的create(),如果使用了框架的自动验证功能,在create()时会验证字段的合法性,有时候我们会多次create,进行批量添加或者修改,这时候会出问题。查看源码,发现是因为里面的$error属性没有重置。设置Model的$patchValidate为true是一种办法,但是会导致返回的错误不再是一个字符串,而是数组,并且即使已经有不合法的字段了,还是会继续验证其他字段,解决办法是

//重写create方法,每次create,清空error
public function create($data = '', $type = '')
{
$this->error = array();
return parent::create($data, $type); // TODO: Change the autogenerated stub
}

3.数据库操作的save()方法,如果在save()方法前面有使用getByxxx()或者find()这些方法的话,一定要记得给save()方法手动传$data数据。或者连贯操作->data($data)->save(),否则当前要添加或保存的数据会变成刚刚查询到的。查看源码可知道原因:

 

  解决办法:

  //更新失败,因为save()的数据是旧数据
$Model->create($data);
$oldData = $Model->getById($data['id']);
$updateRes = $Model->save(); //更新成功
$Model->create($data);
$oldData = $Model->getById($data['id']);
$updateRes = $Model->save($data);//或者用下面那一行
//$updateRes = $Model->data($data)->save();

4、字段缓存问题

  首先是数据库表设计更新以后会有所影响;此外还有个问题,由于我的项目有多个模块,恰好两个模块中有两个模型名都一样,经常出现其中一个模块不能正常添加和修改的情况

后来看了源码才找到原因:字段缓存的文件名是"数据库名+表前缀+模型名",导致两个模型读取的缓存文件名是一样的

  

解决办法:

(1)关闭字段缓存

(2)不同模块设置不同的表前缀

(3)修改模型的名称

个人觉得TP框架的这个缓存机制实在不太合理,模型里面明明都有指定tableName,没必要根据表前缀和模型名去缓存字段

5、S()方法缓存失败

在命令行模式下,执行定时脚本发现S()方法缓存失败,首先想到的就是权限问题,但是检查以后还是不行,后来一步步找到源码,发现缓存文件的路径是C('DATA_CACHE_PATH'),由于APP_PATH是相对路径,导致这个也是相对路径

然而,用crontab执行php脚本,代码里面一定要用绝对路径,否则很容易出错。把APP_PATH设置为__DIR__.'/Application/',问题解决

6、这条不是坑,是个小提示

我们在添加数据时,有时候希望如果已经存在了就更新,通常会用ON DUPLICATE KEY UPDATE语句,之前一直以为thinkPHP没有这个方法,只能通过自己手动拼接sql语句。

这几天看了一下Mysql.class.php的源码发现是支持的,只是官方文档没有给出来。

$addRes = $Model->add($addData,array(),'cpu,mem,hard_disk');

通常我们只会传第一个参数,第二个参数是配置,默认是空数组,第三个参数就是ON DUPLICATE KEY UPDATE要更新的字段。支持字符串和数组的形式。对于addAll()方法也是一样的。

  

thinkPHP使用中踩的坑,记录一下(不停更)的更多相关文章

  1. unionId突然不能获取的踩坑记录

    昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...

  2. CentOS7.4安装MySQL踩坑记录

    CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...

  3. ubuntu 下安装docker 踩坑记录

    ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...

  4. SpringBoot + Shiro + shiro.ini 的踩坑记录

    0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...

  5. 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密

    你真的了解字典(Dictionary)吗?   从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...

  6. google nmt 实验踩坑记录

       最近因为要做一个title压缩的任务,所以调研了一些text summary的方法.    text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...

  7. ABP框架踩坑记录

    ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...

  8. SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录

    Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...

  9. IDFA踩坑记录

    IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...

随机推荐

  1. hadoop高可用HA的配置

    zk3 zk4 zk5 配置hadoop的HA大概可以分为以下几步: 配置zookpeer(namenode之间的通信要靠zk来实现) 配置hadoop的 hadoop-env.sh hdfs-sit ...

  2. LUOGU P3413 SAC#1 - 萌数(数位dp)

    传送门 解题思路 首先这道题如果有两个以上长度的回文串,那么就一定有三个或两个的回文串,所以只需要记录一下上一位和上上位填的数字就行了.数位\(dp\),用记忆化搜索来实现.设\(f[i][j][k] ...

  3. 运维人员最常用150个linux命令汇总

    命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) l ...

  4. ImageMagick convert多张照片JPG转成pdf格式,pdfunite合并PDF文件

      在认识ImageMagick之前,我***的图像浏览软件是KuickShow,截图软件是KSnapShot,这两款软件都是KDE附带的软件,用起来也是蛮方便的.在一次偶然的机会中,我遇到了Imag ...

  5. NYOJ 119 士兵杀敌(三)【ST算法】 分类: Brush Mode 2014-11-13 20:56 101人阅读 评论(0) 收藏

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=119 解题思路: RMQ算法. 不会的可以去看看我总结的RMQ算法. http://blo ...

  6. 搞笑:我是我们村唯一一个搞IT的!

    出自:http://codebay.cn/post/8033.html 当我跟村里人提起我是IT工程师时 他们内心是这样想的 ▼ 也有的朋友这样想 ▼ 爸爸问我,什么狮? ▼ 妈妈问我,工什么? ▼ ...

  7. 使用maven搭建Hibernate

    使用maven搭建Hibernate框架(web项目) create table USERS ( ID NUMBER not null primary key, NAME ), PASSWORD ), ...

  8. <Python基础>python是如何进行内存管理的

    .Python 是如何进行内存管理的?答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制⒈对象的引用计数机制Python 内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用 ...

  9. ReadyAPI创建功能测试的多种方法

    原文:ReadyAPI创建功能测试的多种方法 声明:如果你想转载,请标明本篇博客的链接,请多多尊重原创,谢谢! 本篇使用的 ReadyAPI版本是2.5.0 在ReadyAPI中有多种方法可以创建功能 ...

  10. 阻止a标签跳转/刷新

    <a href='javascript:;' onClick='functionA()'>点击</a> //注意":"."’":均需为英 ...