介绍
小编给大家分享一下使用PDOStatement:: bindParam的陷阱分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
废话不多说,直接看代码:
& lt; php ? $ dbh=new PDO (& # 39; mysql:主机=localhost; dbname=测试# 39;,“test"); 查询美元=& lt; & lt; & lt;查询 插入“用户”(“用户名”,“密码”)值(:用户名、密码); 查询; $声明=$ dbh→准备($查询); $ bind_param=阵列(& # 39;:用户名# 39;=比;“laruence" & # 39;:密码# 39;=比;“weibo"); foreach (bind_param美元美元关键=比;美元值){ 声明→美元bindParam(键,价值美元); } 声明→美元execute (),
请问,最终执行的SQL语句是什么,上面的代码是否有什么问题吗?
好了,我想大部分同学会认为,最终执行的SQL是:
插入“用户”(“用户名”,“密码”)值(“laruence",“weibo");
但是,可惜的是,你错了,最终执行的SQL是:
插入“用户”(“用户名”,“密码”)值(“weibo",“weibo");
是不是很大的一个坑呢?
- - - - - -如果你想自己找到原因,那么就不要继续往下读了- - - - - - - - - - - -
这个问题,来自今天的一个错误报告:# 63281
究其原因,也就是bindParam和bindValue的不同之处,bindParam要求第二个参数是一个引用变量(参考)。
让我们把上面的代码的foreach拆开,也就是这个foreach:
& lt; php ? foreach (bind_param美元美元关键=比;美元值){ 声明→美元bindParam(键,价值美元); }
相当于:
& lt; php ?//第一次循环 值=https://www.yisu.com/zixun/bind_param美元(":用户名"); $声明-> bindParam(”:用户名”,与美元价值);//此时:用户名是对美元价值变量的引用//第二次循环 值=bind_param美元(":密码");//哦!美元价值被覆盖成了:密码的值 $声明-> bindParam(”:密码”,与美元价值);
所以,在使用bindParam的时候,尤其要注意和foreach联合使用的这个陷阱。那么正确的作法呢?
1。不要使用foreach,而是手动赋值
& lt; php ? 声明→美元bindParam (“: username" bind_param美元[“:username"]);//美元价值是引用变量了 声明→美元bindParam (“: password" bind_param美元[“:password"]);
2。使用bindValue代替bindParam,或者直接在执行中传递整个参数数组。
3。使用foreach和引用(不推荐,原因参看:微博)
& lt; php ? foreach (bind_param美元美元关键=比;和美元值){//注意这里 声明→美元bindParam(键,价值美元); }
最后,展开了说,对于要求参数是引用,并且有滞后处理的函数,都要在使用foreach的时候,谨慎!
以上是使用PDOStatement:: bindParam的陷阱分析的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!