|  RSS订阅  |  加入收藏

TP5.1多对多关联中间表批量写入失败

TP5.1.32版本的多对多关联的中间表批量写入有bug,需要改用遍历后单个写入。
摘要

自从上次TP官方自爆了个安全漏洞后,火速就去做了升级,升级完我发现好几个问题,先是刚拉下来的框架就跑不起来,提示控制器不存在,反馈后流年竟然在线秒升级。后面又发现验证码加载不出来了,这个怪我,依赖没搞好,captcha扩展被删了导致的。再接着又发现paginate的query参数丢了,因为更新漏洞后,我发现参数获取方式变了,导致query参数被CDN给过滤了,没办法又去CDN做了下参数过滤排除解决。


然后过了两天我修改文章,发现文章标签又有问题了,选了多个标签,到最后就变成了一个,其他标签莫名都被删了,之前一直好好的,估计有是更新造成的。就去看了官方的更新日志,发现确实有更新多对多关联模型,这下好了,原本不更新没问题,修正了,反而有问题了,难道我之前的是将错就错么。

1.jpg


3.jpg


这个写入结果证明原本应该是多个ID的被写成一个了,就去翻了下belongsToMany的saveAll方法,翻来看去,也没发现啥问题,正常的将数据遍历后执行的save方法。没辙就去做了trace调试,明确的问题就是和预想的一样,不同的值被写成同一个了,那天流年在群里跟另外个小伙伴说做下跟踪调试,在model类431行查看下$this->exists结果,我顺道就去看了下我的,发现第一次写入的时候正常,后面写入都多了个主键,所以数据全写岔了。

2.jpg


4.jpg


对框架底层不熟,一时不知在框架上如何改起,二来下次等TP发版的时候应该就修复了,索性只在我业务层面改下算了,把原本saveAll方面改成遍历后调save方法写入算了(第一张图的注释部分)。


好了,水文结束,对了,似乎多个版本受影响,从5.1.28到5.1.32都有问题。


如文章有用,点下广告吧
  PHP    ThinkPHP    关联    
转载请注明出处,未经许可禁止商用!
发表评论
*依据《网络安全法》规定,您需实名认证后才能评论!
@银色月航:吃饭的本事不能扔下,时不时捡起来啃啃
挺好的,又把技术拾起来啦
@橘子书:玩不来WP的土鳖,没办法
@沈唁志:当时是一个安全更新,不更也得更
羡慕你们这些玩轮子的,一个比一个6
谨慎更新,哈哈哈