PHP PDO bindParam不使用数组内容

时间:2013-02-15 13:51:19

标签: php pdo

我有一种机制,旨在允许用户控制产品出现在产品组中的订单。有一个“grouplines”表( MySQL ),其中包含group_idproduct_idmanual_order的列。前两个将产品分配给,第三个确定订单

manual_order值以 10 开头,并以 10 的增量上升。因此,例如,将产品移动到列表中的第3位只是将其manual_order值更改为25,然后重新计算manual_order值的情况。这是通过获取由manual_order排序的产品ID 列表,并以增量重新编号来完成的。

这段代码有效:

$products = array();
$dbh = s3_pdo::get_connection();
$query = $dbh->prepare('SELECT product_id FROM grouplines WHERE group_id=:group_id ORDER BY manual_order');
$query->bindValue(':group_id', $group_id);
$query->execute();
$rows = $query->fetchAll();
$query->closeCursor();
if ($rows) {
    $query = $dbh->prepare('UPDATE grouplines SET manual_order=:manual_order WHERE group_id=:group_id AND product_id=:product_id');
    $query->bindValue(':group_id', $group_id);
    //$query->bindParam(':product_id', $row['product_id']);
    $query->bindParam(':product_id', $product_id);
    $query->bindParam(':manual_order', $i);
    $i = 10;
    foreach ($rows as $row) {
        $product_id = $row['product_id'];
        $query->execute();
        $i += 10;
    }
}

这不是:

$products = array();
$dbh = s3_pdo::get_connection();
$query = $dbh->prepare('SELECT product_id FROM grouplines WHERE group_id=:group_id ORDER BY manual_order');
$query->bindValue(':group_id', $group_id);
$query->execute();
$rows = $query->fetchAll();
$query->closeCursor();
if ($rows) {
    $query = $dbh->prepare('UPDATE grouplines SET manual_order=:manual_order WHERE group_id=:group_id AND product_id=:product_id');
    $query->bindValue(':group_id', $group_id);
    $query->bindParam(':product_id', $row['product_id']);
    //$query->bindParam(':product_id', $product_id);
    $query->bindParam(':manual_order', $i);
    $i = 10;
    foreach ($rows as $row) {
        //$product_id = $row['product_id'];
        $query->execute();
        $i += 10;
    }
}

正如您所看到的,不同之处在于第二段代码绑定了$product_id,其中 foreach循环的值为(from $row['product_id']),而第一段代码尝试将$row['product_id']绑定到循环之外......据我所知,这应该可以正常工作,但不会。

我只能猜测为什么第二段代码不起作用,因为我找不到明确的答案。我想要一个明确的答案,因为我刚开始使用PDO,并且不希望因为我将系统的其余部分转换为使用PDO来改变这种事情。旧的 mysql _ 函数。

2 个答案:

答案 0 :(得分:2)

让我们看看你的代码做了什么:

$query->bindParam(':product_id', $row['product_id']);

在这里,您隐式创建一个包含一个元素的数组$row,并将此元素作为bindParam()的引用。这导致如下结构:

$row : Array(
           'product_id' => &null
       )

请注意$row本身不是参考!一旦你到达循环:

foreach ($rows as $row)

数组$row覆盖。此时您正在丢失旧$ row-Array中的引用,该数组不再存在。引用不能自动跳转到不同的数组,只是因为它具有相同的键并恰好被分配给同一个变量。

长话短说:你想做的事情是不可能的。

答案 1 :(得分:-1)

  1. 您指的是未定义的数组索引$row['product_id']
  2. $query->bindParam(':product_id', $row['product_id']);声明 失败。
  3. 使用try catch来捕获异常