到目前为止,我无法通过我有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
你能帮助我们,所以我的颜色不会在我的田地里复制相同的颜色。 我已经在这里放了一个星期。希望你能帮助我们。谢谢!
答案 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