• 展开微博窗口
  • QQ:52619941
  • 微信:cnmemory
  • 展开分类目录
  • 还没有账号?

Memory

当foreach遇到PDOStatement:bindParam

前段时间在开发一个小项目的时候遇到了一个问题,只怪学艺不精,我们先看看代码:

<?php
$data = $_REQUEST['data'];
$sql = "update config set price1=?, price2=?, price3=? ";
$stmt = $dbh->prepare($sql);
foreach($data as $key=>$val) {
$stmt->bindParam(($key+1), $val);
}
$stmt->execute();
?>

上述代码的意思是把表单传递过来的数据通过遍历的方式绑定到SQL语句中,只要表单的顺序没有错,应该会形成如下SQL:

update config set price1=1000,price2=2000,price3=3000

然而最后的结果却让我大吃一惊,譬如我传入的数据是1000,2000,3000,那么最终的SQL语句却是

update config set price1=3000, price2=3000,price3=3000

这是为什么呢?因为bindParam中第二个参数要求我们使用引用变量,自然而然在bindParam的过程中,value会不断的被后面的value所覆盖。

解决方法一:

使用bindValue代替bindParam

解决方法二:

foreach($array as $key=>&$val){} //注意这里的&$val

如果你采用方法二解决,一定要记住便利之后使用unset($val)注销掉$val ,为什么要这样做,官方也没有明确解释,下面给出一个官方的例子你就知道了:


"Reference of a $value and the last array element remain even after the foreach loop. It is recommended to destroy it by unset()."

I cannot stress this point of the documentation enough! Here is a simple example of exactly why this must be done:

<?php
$arr1 = array("a" => 1, "b" => 2, "c" => 3);
$arr2 = array("x" => 4, "y" => 5, "z" => 6);

foreach ($arr1 as $key => &$val) {}
foreach ($arr2 as $key => $val) {}

var_dump($arr1);
var_dump($arr2);
?>

The output is:
array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> &int(6) }
array(3) { ["x"]=> int(4) ["y"]=> int(5) ["z"]=> int(6) }

Notice how the last index in $arr1 is now the value from the last index in $arr2!
码字很辛苦,转载请注明来自雨林寒舍《当foreach遇到PDOStatement:bindParam》

评论

  1. 一个程序猿 #1

    当年刚结婚时,老婆称呼我为“大宝”,后来有了儿子,她又叫儿子“大宝”,我自然升级为“太宝”。那天儿子把我俩的称呼写在纸上,他看了一会儿,兴奋地对我说:爸爸,你看我妈多有才呀!从字面上就可以看出来,你裤裆里只比我长那么一点点!

    回复
    2016-01-23
  2. 丛林映像 #2

    我想知道这个代码高亮插件是什么名字。找不到和主题这么匹配的啊QAQ

    回复
    2015-11-22
  3. 发的 #3

    [java]辅导费的否定
    的方法第三方[/java]

    回复
    2015-11-16
  4. #4

    vcxzvcxzvcxzvcxzvcxzvcxz

    回复
    2015-11-15
  5. 薛军强 #5

    test

    回复
    2015-11-13
  6. test #6

    test

    回复
    2014-11-6
    • test

      fdsafsdafasd

      回复
      2014-11-6
      • test

        fdsafadsf

        回复
        2014-11-6
  7. 无名 #7

    hehe

    回复
    2014-11-3
  8. 1 #8

    1

    回复
    2014-09-30