3

我有一种机制,旨在允许用户控制产品出现在产品组中的顺序。有一个“ ”表(MySQL),其中包含、和. 前两个将产品分配到,第三个确定顺序grouplinesgroup_idproduct_idmanual_order

这些manual_order值从 10 开始并以10增量递增。因此,例如,将产品移动到列表中的第 3 位,只需将其值更改为 25,然后重新计算值。这是通过获取按 排序的产品 id 列表并递增方式对其重新编号来完成的。manual_ordermanual_ordermanual_order

这段代码有效:

$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_idforeach 循环,而第一段代码尝试在循环之外绑定(from $row['product_id'])......我所知应该工作,但没有。$row['product_id']

我只能猜测为什么第二段代码不起作用,因为我找不到明确的答案。我想要一个明确的答案,因为我不熟悉使用 mysql_ 函数,PDO并且不想在我将系统的其余部分转换为使用PDO而不是旧的mysql_函数时遇到这种事情。

4

2 回答 2

2

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

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

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

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

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

foreach ($rows as $row)

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

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

于 2013-02-15T14:49:20.553 回答
-1
  1. 您指的是未定义的数组索引 $row['product_id']
  2. $query->bindParam(':product_id', $row['product_id']); 声明失败。
  3. 使用 try catch 捕获异常
于 2013-02-15T14:11:01.770 回答