使用PDOStatement: bindParam的陷阱分析

  介绍

小编给大家分享一下使用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的陷阱分析的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

使用PDOStatement: bindParam的陷阱分析