我有一种机制,旨在允许用户控制产品出现在产品组中的订单。有一个“grouplines
”表( MySQL ),其中包含group_id
,product_id
和manual_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 _ 函数。
答案 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)
$row['product_id']
$query->bindParam(':product_id', $row['product_id']);
声明
失败。