|  RSS订阅  |  加入收藏

thinkPHP升级到5.0.13导致update更新出错的问题

5.0.13是一个集合诸多改进的版本,可以从5.0.12无缝升级到5.0.13。博主从5.0.12更新到5.0.13,遇到update更新出错。缘由是因为待更新的数据格式不严谨。在thinkPHP5.0.13的更新说明中有一项修正Query类的inc和dec方法的Mysql关键词问题。从而导致不严谨的数据无法正确写入数据库造成更新失败。
摘要

话题还得从tinkPHP群消息说起,双十二那天,群内通知官方发布了5.0.13版本。刚好那几天在折腾redis缓存。官方文档中说5.0.13是一个集合诸多改进的版本,redis缓存驱动使用serialize替换了原先的json序列化。而博主的程序初始版本还是在5.0.10的基础上搭建了,后面在博客发布的时候更新到了5.0.11。想着官方已经发布了5.0.13,已经跨版了,就折腾起来。

折腾之前看了下官方升级指导,发现从5.0.11可以无缝升级的5.0.12,并且5.0.12可以无缝升级到5.0.13.所以也就信心满满的去折腾升级了,拷贝了下think核心中的success和error的跳转模版、paginate的分页类(被我修改过)。其它文件直接覆盖了。更新好以后就去点了几个页面,完全正常,添加了条测试信息也无误,也就直接更新到服务器上去了。

更新完成后,当我去写博客的更新日志的时候,问题来了,直接报错了个致命错误。

[8] ErrorException in Builder.php line 114
 未定义数组下标: 0  

未定义数组下标,当时没反应过来是我的待写入数据的问题,因为之前一直是正常的。也就没多想,就去看了下builder.php的源码,114行的代码就是官方更新日志里面关于inc和dec关键字修复的问题。和5.0.12版本对比发现也只是多了个switch判断。似乎问题也不在这里,这下就陷入了僵局。

因为是数组下标的问题。问题最大的可能还是出在我的应用层面上,和框架底层关系不大。没办法,只好从头检查了一遍应用逻辑,从前端表单开始,到后台接收。尝试静态写入数据,发现一切正常,只好打印了下input接收的数据。粗看之下没问题,等等,怎么成了个input的接收的数组里面嵌套了一个一维数组,看起来像是一个二维数组,但不是一个真正的二维数组。复现当时的情况如下:

array(12){
["aaa"]=>string(10) "aaa"
["bbb"]=>string(10) "bbb"
["xxx"] => array(1) {
    ["xxx"] => string(46) "yyy"
  }
 ["ccc"]=>string(10) "ccc"
}

看复现的这个数组,正常待写入的数据应该是一个一维数组,键名为字段名,键值为数据。这里xxx键名对应的键值又是一个同名的数组。至此终于发现这个问题,因为待写入的值又是一个一维数组,所以就无法找到下标了。现在这个问题就简单了,xxx是我从数据库读出来的数据,find以后是一个一维数组,虽然使用了field限定单一字段,但是我忘了将数据从这个只有一条数据的数组中提出。造成了这里嵌套了一个一维数组。更新后的待写入字段

array(12){
["aaa"]=>string(10) "aaa"
["bbb"]=>string(10) "bbb"
["xxx"] => string(46) "yyy"
["ccc"]=>string(10) "ccc"
}

这样就一切正常了,至此问题解决,最后忠告,逻辑层面还是需要仔细再仔细。

打赏
  ThinkPHP    
转载请注明出处,未经许可禁止商用!
发表评论
*依据《网络安全法》规定,您需实名认证后才能评论!