在具有相同ID

时间:2015-12-01 01:45:33

标签: php sql

到目前为止,我无法通过我有2列

的方式解决有关此更新的问题

ID和颜色

在我的保存中我有这个

Number of color: 4
Color 1: RED
Color 2: BLACK
Color 3: YELLOW
Color 4: BLUE

现在它已成功保存在我的数据库中,现在我想将颜色更新到此

Color 1: GREEN
Color 2: YELLOW
Color 3: BLACK
Color 4: WHITE

在测试阶段使用for循环我得到了正确的颜色组合

$color1 = $_POST['color1'];
$count = count($color1);

for ($x = 0; $x <=$count; $x++) {

        echo  $savecolor = $color1[$x];
}

但是当我添加像这样的更新代码时

$color1 = $_POST['color1'];
$count = count($color1);

for ($x = 0; $x <=$count; $x++) {

$savecolor = $color1[$x];

$stmt = $db->prepare('UPDATE productcolor SET colorName = :color WHERE  productinformationID=:productinformationID');

$stmt->execute(array(':color' => $savecolor, ':productinformationID' =>$prodID));


}

结果就像这样

Color 1: WHITE
Color 2: WHITE
Color 3: WHITE
Color 4: WHITE

在实际数据库中,它看起来像这样

productcolorID(PK)       productinformationID(FK)       color
306                      50                             ORANGE
307                      50                             ORANGE
308                      50                             ORANGE
309                      50                             ORANGE

prodID来自

 $prodID   = $row['productinformationID']; its equals to 50

你能帮助我们,所以我的颜色不会在我的田地里复制相同的颜色。 我已经在这里放了一个星期。希望你能帮助我们。谢谢!

3 个答案:

答案 0 :(得分:1)

Anly走在正确的轨道上。您每次都要更新相同的记录。您需要为&#34; productinformationID&#34;指定不同的值。和&#34; prodID&#34;每次迭代循环。

$colors = $_POST['colors'];
$count = count($colors);
$ids = $_POST['ids'];

for ($x = 0; $x <= $count; $x++) {
    echo $colors[$x] . " " . $ids[$x] . "\n";
}

答案 1 :(得分:1)

John Doe发现了问题:您正在使用每个语句更改所有记录,因为WHERE子句与它们匹配。他们都有相同的productinformationID。这就是为什么你只看到最后一个声明的效果 - 它覆盖了以前的所有声明。

要修复它,您需要添加唯一标识记录的位。

$color1 = $_POST['color1'];
$count = count($color1);

for ($x = 0; $x <=$count; $x++) {

    $savecolor = $color1[$x];

    $stmt = $db->prepare('UPDATE productcolor SET colorName = :color WHERE  productinformationID=:productinformationID AND productcolorID=:productcolorID');

    $stmt->execute(array(':color' => $savecolor, ':productinformationID' =>$prodID, ':productcolorID' => $x));
}

(请注意,我添加到代码中的是两条长行的末尾,所以你需要滚动才能看到它)

我确实认识到:productcolorID的值并不完全等于$x。但最好由你确定。

- 编辑

这是便利功能,可能有用也可能没用:

function fetch($query, $params=array(), $fetchMode=PDO::FETCH_ASSOC) {
    global $db;

    $stmt = $db->prepare($query);
    if (!$stmt->execute($params))
        return false;

    if ($stmt->rowCount() > 1)
        return $stmt;

    $result = $stmt->fetch($fetchMode);

    if (count($result) > 1)
        return $result;

    return reset($result);
}

使用它可以得到:productcolorID这样的偏移量:

$offset = fetch('SELECT MIN(productcolorID) FROM productcolor WHERE productinformationID=?', array($prodId));

之后,代码与上面几乎相同。唯一的区别是:productcolorID

的值
$stmt = $db->prepare('UPDATE productcolor SET colorName = :color WHERE  productinformationID=:pid AND productcolorID=:cid');

$colorsCount = count($colors);
for ($i = 0; $i < $colorsCount; $i++) {
    $color = $colors[$i];

    $stmt->execute(array(
        ':color' => $color,
        ':pid' => $prodID,
        ':cid' => $offset + $i)
    );
}

- BTW
我只是想说我发现你的编码风格和命名惯例太可怕了!

答案 2 :(得分:0)

尝试没有循环和所有其他内容的预定义查询。只需准备一个语句,并在参数数组中(您传递给执行)设置:color => "RED"或您实际接收的任何内容。这将确认值在SQL语句中是有效的 它可能是有效,字段的默认值为WHITE,这可以解释为什么它们都变为WHITE

相关问题