PHP foreach循环用最后一条记录覆盖所有项目

时间:2016-01-15 14:16:44

标签: php mysql pdo foreach

我正在尝试更新mysql表,但我不知道为什么,但所有记录都填入了最后一个条目。

这是我的PHP代码:

[...]

if (isset($_POST['update'])){

$doorNumber = $_POST['doorNumber']; //array
$doorDescription = $_POST['doorDescription']; //array

//update data
$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


foreach($doorNumber as $key => $val){
  $door = $pdo->prepare("UPDATE doors SET number = ?, description = ? WHERE acc_id = ?");
  $door->execute(array($doorNumber[$key], $doorDescription[$key], $id));
}

Database::disconnect();
header('Location: index.php');

[...]

以下是相关的html:

[...]

<table class="table">
            <thead>
                <tr class="text-uppercase">
                  <th></th>
                  <th>Door #</th>
                  <th>Description</th>
                </tr>
            </thead>
            <tbody>                        
                <?php
                    foreach ($rooms as $row){
                        echo '<tr class="text-left text-capitalize">';
                        echo '<td><input type="checkbox" name="chk[]" checked="checked"</td>';
                        echo '<td><input type="number" class="form-control" id="doorNumber[]" name="doorNumber[]" value=' .$row['number']. '></td>';
                        echo '<td><textarea rows="1" class="form-control" id="doorDescription[]" name="doorDescription[]">' .$row['description']. '</textarea></td>';
                        echo '</tr>';
                    }
                ?>
            </tbody>
          </table>
[...]

该表位于从mysql数据库通过$ _GET [&#39; id&#39;]请求获取记录的表单内(因此设置变量$ id的值)。每当我更新记录时,在提交时(即$ _POST [&#39; update&#39;]),表格都会更新,但所有记录都将等于最后一次输入。

非常感谢任何帮助。

提前致谢。

1 个答案:

答案 0 :(得分:0)

如果html表列出属于acc_id的所有门和门描述,则每个更新语句都会更新属于某个帐户的所有门号和描述,因为在where条件中仅提供acc_id。

如果您想单独维护门号,则必须将它们包含在where条件中以及及其原始值(假设您不能拥有给定帐户的重复门号):

UPDATE doors SET number = ?, description = ? WHERE acc_id = ? and number=?

我会在html表单中添加一个隐藏控件:

echo '<input type="hidden" name="originalnumber[]" value="' .$row['number']. '"';

我会添加一个新数组:

$originaldoorNumber = $_POST['originalnumber']; //array

sql将按以下方式执行:

$door->execute(array($doorNumber[$key], $doorDescription[$key], $id, $originaldoorNumber[$key]))
相关问题