话题还得从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"
}
这样就一切正常了,至此问题解决,最后忠告,逻辑层面还是需要仔细再仔细。