PDOStatement::bindParam() 和 foreach 的陷阱

在使用PDOStatement的bindParam()与foreach结合时,遇到执行失败的问题。当数组值全为可转为int的类型时execute成功,否则失败。解决方案包括不用foreach、使用bindValue()或直接在execute()中使用数组。然而,使用foreach时需注意bindParam()要求传递引用变量,可能导致问题。Laruence建议避免bindParam与foreach结合使用,因为这可能导致滞后处理的函数引发错误。测试显示,应在使用foreach前验证变量已分配空间,并确保遍历后不会再次使用最后一个值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在使用PDO封装数据操作类的时候,我使用了PDOStatement的bindParam()函数,代码如下:
这里写图片描述

这里我使用了foreach遍历传进来的$arr!

测试时候PDOStatement::queryString输出正确,bindParam()函数返回true,但是execute的时候就是false,花了一个下午的时间测试,发现如果arrvalue 全是 1、 ‘123’ 这种可以转化为int类型的则execute返回true,但是一旦$value中有其他字符,execute就返回false!!!

然后下面是我想出来的解决方案:
1. 不用foreach, 手动赋值
很麻烦有木有……, 而且因为是封装类,我根本不知道会传进来什么参数好么……
2.使用bindValue()代替bindParam(),或者直接在execute()中使用数组
这个方法好呀好呀好呀,但是我任性,就是要用foreach,怎麽办怎麽办呢?
3.就要用foreach!
记得&就好啦~


这里写图片描述
哈哈 问题解决,

但是呢
为什么要引用呢??
因为bindParam的第二个参数要求是引用变量!
巨大的坑坑坑

最后吧, 还是不推荐bindParam和foreach一起使用

因为有一个大神Laruence说 不推荐
Laruence:“对于要求参数是引用, 并且有滞后处理的函数, 都要在使用foreach的时候, 谨慎!”

为什么说不推荐呢?
想知道?
快来按照Laruence给出的代码来测试一下。
这里写图片描述

这里写图片描述
以上是test1报的错误,因为$a是null, 所以不能被引用。
因此要引用变量的时候要注意验证变量是否已经分配了空间哦~

这里写图片描述
以上是test2的测试结果
我们在foreach里面var_dump($arr)就能清楚的看到过程了
这里写图片描述
看到了没看到了没! 以后如果要对一个数组进行foreach($arr as $val)一定要确保之后不会再使用$arr, 至少不再使用$arr最后的一个值!
怎麽办,以后写foreach都怕怕的了 T T

这里写图片描述
我用的是php5.5 test3 的bug在5.4之后就修复了,我就懒得测试test3如果在5.4之前会发生什么bug了……

这里写图片描述
上面是test4的测试结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值