PHP使用CommonDao框架的坑

84 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

前言

小BUG中的大问题 —— CommonDao close 的坑

BUG就不具体说是什么了,只说技术上的表现,同样的创建数据库连接方式,同样的参数,同样的调用,在不同的方法中,数据插不进数据库了

然后就在疯狂的找不同。。。然后疯狂的试验。。。并在一个封装的方法中找到了问题。。。一个 close ⬇️

企业微信截图_fd9d0132-4bbd-4f46-938e-7c265374966f.png

在这个封装的方法前后,调用什么都一样的方法插入数据库,在封装的方法之前都是正常的,在封装的方法之后的都是不通的,那么应该就是这个引起的,那么开始深挖是为什么

表现和原因

那么可以假设问题是出在了 dao中,那么dao 中,那么dao 是由 new CommonDao4sSelf 创建的实例 (全局搜索是最简单的)

企业微信截图_880862ef-afd2-4b4f-be3b-e3e22fee3d85.png

开始找 CommonDao4sSelf 是从哪里引进来的,继承和引用都有可能,需要都差一遍

企业微信截图_2e9c3fb7-35ec-4008-885c-97beb4b0171b.png

最后在 Init.inc.php 文件中找到了

企业微信截图_efb500ca-d41b-4016-8450-5c12a66b7909.png

然后进去 CommonDao4sSelf.php 文件,解读源码

企业微信截图_017e9bf8-d86f-48d7-99f6-15e69d6e56ca.png

企业微信截图_7db8f854-5379-4c17-84f9-25eb197901a6.png

将 $mydbpools 输出,就会发现一个问题,只要是close过的就会在 数据库连接池子中留下标记,没有close过的 池子中什么都不会留下

企业微信截图_47791593-490d-468d-8732-ab6b04a032db.png

企业微信截图_96ace073-7ebd-4b04-abc4-e40081434b38.png

这次BUG之所以会出现的原因就是因为,一旦程序中,恰巧连接同一个数据库,并且第一次连接之后就关闭了,导致第二次连接时,连接不上更新不了数据(不会报任何的错,也不会终止程序进行)

总结

解决方案:

1、把 $dao->close 干掉 || 再最后一次连接(或者报错)的时候进行close

2、把 CommonDao4sSelf.php 文件中的 判断当前数据库连接是否存在的判断干掉 (亲测有效)

3、业务代码中在dao>close之后,dao->close之后,将 mydbpools 中,本次(全部)纪录的排除掉,然后将 $mydbpools 重新赋值 (亲测有效)

4、在 close 方法里处理 $mydbpools (待测)