PHP - foreach仅更新第一行

时间:2017-08-21 10:10:09

标签: php mysql foreach

我尝试使用表单和foreach循环更新多行。我已经尝试过在stackoverflow上找到的解决方案,但似乎无法让它发挥作用。我在页面project.php?id = 13

上工作

我的HTML表单:

<form method="post" action="project.php?id=<?php echo $id; ?>">
<?php while($row = $shops->fetch_assoc()) : ?>
<input type="hidden" name="shop[]" value="<?php echo $row['id']; ?>">
<input type="text" name="boxposition[]" class="form-control" value="<?php echo $row['box_position']; ?>" style="width: 50px;">
<input type="submit" name="update" value="Update Order" class="btn btn-primary">
<?php endwhile; ?>
</form>

我的PHP代码(在同一页面上)执行if(isset($ _ POST [&#39; update&#39;])):

$shopid = $_POST['shop'];
$boxorder = $_POST['boxposition'];

foreach ($shopid as $index => $value) {
$query = "UPDATE shops SET box_position = '".$boxorder[$index]."' WHERE id = '".$shopid[$index]."'";
$update_row = $db->update($query);

不幸的是,它只更新第一行(最低ID)。非常奇怪的是,当我使用它回音时,我得到了正确的值。 E.g:

echo $shopid[$index].'<br>';
echo $boxorder[$index].'<br>';

一个例子: 我更新$ boxorder 2行:
第1行(对于商店1):新值= 6(旧值为7)
第2行(商店2):新值= 8(旧值为5)

使用foreach回显结果,它显示正确的值:
1(店铺ID)
6(新的boxorder值)
2(店铺ID)
8(新的boxorder值)

我错过了什么?在此先感谢帮助我!

2 个答案:

答案 0 :(得分:1)

尝试以下

 <?php while($row = $shops->fetch_assoc()) : ?>
        <form method="post" action="project.php?id=<?php echo $id; ?>">
        <input type="hidden" name="shop[]" value="<?php echo $row['id']; ?>">
        <input type="text" name="boxposition[]" class="form-control" value="<?php echo $row['box_position']; ?>" style="width: 50px;">
        <input type="submit" name="update" value="Update Order" class="btn btn-primary">
        </form>
  <?php endwhile; ?>

<form method="post" action="project.php?id=<?php echo $id; ?>">

<?php while($row = $shops->fetch_assoc()) : ?>
<input type="hidden" name="shop[]" value="<?php echo $row['id']; ?>">
<input type="text" name="boxposition[]" class="form-control" value="<?php echo $row['box_position']; ?>" style="width: 50px;">
<input type="submit" name="update" value="Update Order" class="btn btn-primary">
<?php endwhile; ?>
</form>

答案 1 :(得分:0)

$shopid = $_POST['shop'];
$boxorder = $_POST['boxposition'];

$query = "UPDATE shops SET box_position =? WHERE id =?";
$db->prepare($query);
foreach ($shopid as $index => $value) {
  $db->execute(array($boxorder[$index], $shopid[$index]));
}

这应该这样做。这样您就可以使用?准备语句并将其填入您的每个语句中。

你也可以这样做:

$query = "UPDATE shops SET box_position = :position WHERE id = :id ";
$db->prepare($query);
foreach ($shopid as $index => $value) {
  $db->execute(
    array(
      ':position' => $boxorder[$index],
      ':id'      => $shopid[$index]
    )
  );
}