gpt4 book ai didi

PHP PDO bindParam 不适用于数组内容

转载 作者:搜寻专家 更新时间:2023-10-31 21:37:53 26 4
gpt4 key购买 nike

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

manual_order 值以 10 开始并以 10 递增。因此,例如,将 product 移动到列表中的第 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;
}
}

如您所见,不同之处在于第二段代码绑定(bind)了 $product_id,它被赋予了一个值 (from $row['product_id'])foreach 循环,而第一段代码尝试在 循环 之外绑定(bind) $row['product_id']...据我所知应该有效,但没有。

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

最佳答案

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

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

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

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

请注意,$row 本身不是引用!一旦你到达循环:

foreach ($rows as $row)

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

长话短说:您尝试做的事情是不可能的。

关于PHP PDO bindParam 不适用于数组内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14896221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com