PHP PDO bindParam 不适用于数组内容

标签 php pdo

我有一种机制,旨在让用户控制产品产品组中的顺序。有一个“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/

相关文章:

php - 如何将最后一位数字为 0 的浮点值输入数据库?

php - 计算MySQL查询时的时间差

php - Laravel 试图删除最后添加的 MySQL 行

php - 更新数据库记录不起作用

php - 如果上一页 == X.com 则运行 PHP 查询

php - 如何通过经纬度查找20公里以内的用户

php - 为什么 Symfony2 不捕获异常

php - 如何使用 PDO 的密码散列来使我的代码更安全?

PHP 警告 PHP 启动无法加载动态库 php_pdo_sqlsrv_7_ts_x64.dll

php - 在 php 中更新表