thinkPHP使用中踩的坑,记录一下(不停更)
版本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使用中踩的坑,记录一下(不停更)的更多相关文章
- unionId突然不能获取的踩坑记录
昨天(2016-2-2日),突然发现系统的一个微信接口使用不了了.后来经查发现,是在网页授权获取用户基本信息的时候,unionid获取失败导致的. 在网页授权获取用户基本信息的介绍中(http://m ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- ubuntu 下安装docker 踩坑记录
ubuntu 下安装docker 踩坑记录 # Setp : 移除旧版本Docker sudo apt-get remove docker docker-engine docker.io # Step ...
- SpringBoot + Shiro + shiro.ini 的踩坑记录
0.写在前面的话 好久没写博客了,诶,好多时候偷懒直接就抓网上的资料丢笔记里了,也就没有自己提炼,偷懒偷懒.然后最近参加了一个网络课程,要交作业的那种,为了能方便看下其他同学的作业,就写了个爬虫把作业 ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- google nmt 实验踩坑记录
最近因为要做一个title压缩的任务,所以调研了一些text summary的方法. text summary 一般分为抽取式和生成式两种.前者一般是从原始的文本中抽取出重要的word o ...
- ABP框架踩坑记录
ABP框架踩坑记录 ASP.NET Boilerplate是一个专用于现代Web应用程序的通用应用程序框架. 它使用了你已经熟悉的工具,并根据它们实现最佳实践. 文章目录 使用MySQL 配置User ...
- SpringBoot+SpringSecurity+Thymeleaf认证失败返回错误信息踩坑记录
Spring boot +Spring Security + Thymeleaf认证失败返回错误信息踩坑记录 步入8102年,现在企业开发追求快速,Springboot以多种优秀特性引领潮流,在众多使 ...
- IDFA踩坑记录
IDFA踩坑记录: 1.iOS10.0 以下,即使打开“限制广告跟踪”,依然可以读取idfa: 2.打开“限制广告跟踪”,然后再关闭“限制广告跟踪”,idfa会改变: 3.越狱机器安装开发证书打的包, ...
随机推荐
- 线段树区间合并+k维空间的曼哈顿距离——cf1093G好题
和去年多校的CSGO一样,用状态压缩来求Manhattan距离的最大值 然后要用线段树维护一下区间最大值 /* k维空间给定n个点,两个操作 1 i b1 b2 .. bk : 修改第i个点的坐标 2 ...
- Android Matrix理论与应用详解
转:http://zensheno.blog.51cto.com/2712776/513652 Matrix学习——基础知识 以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GD ...
- 不能scp到本地mac,mac打开ssh服务
设置->共享->远程登录->所有用户
- Django高级实战 开发企业级问答网站✍✍✍
Django高级实战 开发企业级问答网站 1. 创建项目与app 创建项目 django-admin startproject firstsite 创建app python manage.py sta ...
- neo4j中cypher语句多个模糊查询
总结一下经验: neo4j中,cypher语句的模糊查询,好像是个正则表达式结构. 对于一个属性的多个模糊查询,可以使用如下写法: 比如,查询N类型中,属性attr包含'a1'或者'a2'的所有节点. ...
- 《代码整洁之道》ch5~ch9读书笔记 PB16110698(~3.15) 第二周
<代码整洁之道>ch5~ch9读书笔记 本周我阅读了本书的第5~9章节,进一步了解整洁代码需要注意的几个方面:格式.对象与数据结构.错误处理.边界测试.单元测试和类的规范.以下我将分别记录 ...
- 新安装一个eclipse,导入一个web项目,右键点击项目选择Properties,找不到project facets和Server选项。
解决方式: 1.点击:eclipse导航栏中点击Help->Install New Software 2.点击Add添加 3在弹出框中填写以下信息 name:keep(名字随便取) locati ...
- [转]Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
- [JZOJ5233] 【GDOI模拟8.5】概率博弈
题目 题目大意 给你一棵树,这棵树上的所有叶子节点的权值是随机的排列. 两个人博弈,从根开始,轮流往下走. 先手希望权值最大,后手希望权值最小. 问期望的最终结果. 思考历程 这场比赛实在是太丧心病狂 ...
- LinkedHashMap笔记
一.最基本元素存储单元 /** * HashMap.Node subclass for normal LinkedHashMap entries. */ static class Entry<K ...