【问题标题】:Foreach loop updating every database valueForeach 循环更新每个数据库值
【发布时间】:2018-01-16 21:42:58
【问题描述】:

下午好,

我正在创建一个日志,其中有单独的 div。
每个 div 元素显示不同的日志,其中包含特定于 div 中每个日志的数据。
对于每个日志,我都有一个提交按钮,允许更新和编辑表单。

发生的情况是,当我提交表单时,它会更新我数据库中的每个条目,而不仅仅是 1 个条目。 我知道问题出在我的 foreach 循环上,但我不确定如何解决这个问题。

任何帮助或指点将不胜感激。

代码如下:

<?php 
    $sqlGrow = "SELECT * FROM grow_details ";
    $query = $conn->query($sqlGrow);

    $grows = array();

     while ($grow = mysqli_fetch_assoc($query) ) {
        $grows[] = $grow;
    } 

    foreach($grows as $grow) {
        $id = $grow['id'];
        $growName = $grow['name'];
?>
    <div class="container">
        <div class="details">
            <h2><?php echo $grow['name']; ?></h2>
            <p class="growNum">Grow #: <?php echo $id; ?></p>
            <table class="growDetails">
                <form method="POST" action="">
                    <tr>
                        <td class="label_growDetails"><label for="datePlanted">Date Planted:</label></td>
                        <td><input type="text" name="edit_datePlanted" id="edit_datePlanted" value="<?php echo $grow['datePlanted']; ?>" />
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="strain">Strain:</label></td>
                        <td><input type="text" name="edit_strain" id="edit_strain" value="<?php echo $grow['strain']; ?>" /></td>
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="toMaturity">Days to mature:</label></td>
                        <td><input type="text" name="edit_toMaturity" id="edit_toMaturity" value="<?php echo $grow['toMaturity']; ?>" /></td>
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="type">Type:</label></td>
                        <td><input type="text" name="edit_type" id="edit_type" value="<?php echo $grow['type']; ?>" /></td>
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="gender">Gender:</label></td>
                        <td><input type="text" name="edit_gender" id="edit_gender" value="<?php echo $grow['gender']; ?>" /></td>
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="medium">Medium:</label></td>
                        <td><input type="text" name="edit_medium" id="edit_medium" value="<?php echo $grow['medium']; ?>" /></td>
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="watts">Watts:</label></td>
                        <td><input type="text" name="edit_watts" id="edit_watts" value="<?php echo $grow['watts']; ?>" /></td>
                    </tr>
                    <tr>
                        <td class="label_growDetails"><label for="lightType">Light Type:</label></td>
                        <td><input type="text" name="edit_lightType" id="edit_lightType" value="<?php echo $grow['lightType']; ?>" /></td>
                        <td class="edit"><input type="submit" name="submit_editGrowDetails" id="submit_editGrowDetails" value="&nbsp;&nbsp;&nbsp;Save Edits&nbsp;&nbsp;&nbsp;" /></td>
                    </tr>
                </form>
            </table>

        </div>

以及提交按钮的PHP:

<?php
if(isset($_POST['submit_editGrowDetails'])){
    $edit_datePlanted = mysqli_real_escape_string($conn, $_POST['edit_datePlanted']);
    $edit_strain = mysqli_real_escape_string($conn, $_POST['edit_strain']);
    $edit_toMaturity = mysqli_real_escape_string($conn, $_POST['edit_toMaturity']);
    $edit_type = mysqli_real_escape_string($conn, $_POST['edit_type']);
    $edit_gender = mysqli_real_escape_string($conn, $_POST['edit_gender']);
    $edit_medium = mysqli_real_escape_string($conn, $_POST['edit_medium']);
    $edit_watts = mysqli_real_escape_string($conn, $_POST['edit_watts']);
    $edit_lightType = mysqli_real_escape_string($conn, $_POST['edit_lightType']);

    $name = $grow['name'];

    $edit_growDetails = "UPDATE grow_details
                 SET datePlanted = '$edit_datePlanted', 
                    strain = '$edit_strain', 
                    toMaturity = '$edit_toMaturity', 
                    type = '$edit_type', 
                    gender = '$edit_gender', 
                    medium = '$edit_medium', 
                    watts = '$edit_watts', 
                    lightType = '$edit_lightType' 
                 WHERE name = '$name'; ";

    $query_edit_growDetails = $conn->query($edit_growDetails);

    if($query_edit_growDetails) {
        echo '<p class="success" id="success">Successfully updated log for '.$name.'! <a class="refresh" href="journal.php">Refresh</a></p>';
    } else {
        echo '<p class="error" id="error">There was an error: '. $conn->error .'</p>';
    }
}
?>

【问题讨论】:

  • name 是该表上的唯一键
  • 不,id是表中的唯一键。即使我要使用 WHERE id = $id,它仍然会在我提交表单时更新每个条目,尽管它仍在 foreach 循环中。当我提交它时,它会提交 foreach div,而不仅仅是那个特定的。
  • 我在想,如果我把提交按钮的名称变成一个数组,我也许可以让它工作。不过,不确定如何做到这一点。正在调查。

标签: php html loops foreach


【解决方案1】:

您应该始终按表的ID 进行更新,而不是名称,因为有些可能具有相同的名称。

假设你有:

ID | Name
1   | Test 1
2   | Test 2
3   | Test 1

使用您现在的更新查询,如果您更新“测试 1”,它将同时更新 ID 为 1 和 3 的“测试 1”。

要解决这个问题,在您的 html 表单上,您应该在表单下放置一个隐藏字段,如下所示:

<form method="POST" action="">
    <input type="hidden" value="<?php echo $grow['id']; ?>" name="edit_id">
...
...
rest of code

这将回显您正在编辑的项目的 ID。

那么在你的php端,你应该这样做:

<?php
if(isset($_POST['submit_editGrowDetails'])){
    $edit_datePlanted = mysqli_real_escape_string($conn, $_POST['edit_datePlanted']);
    $edit_strain = mysqli_real_escape_string($conn, $_POST['edit_strain']);
    $edit_toMaturity = mysqli_real_escape_string($conn, $_POST['edit_toMaturity']);
    $edit_type = mysqli_real_escape_string($conn, $_POST['edit_type']);
    $edit_gender = mysqli_real_escape_string($conn, $_POST['edit_gender']);
    $edit_medium = mysqli_real_escape_string($conn, $_POST['edit_medium']);
    $edit_watts = mysqli_real_escape_string($conn, $_POST['edit_watts']);
    $edit_lightType = mysqli_real_escape_string($conn, $_POST['edit_lightType']);

    $id = mysqli_real_escape_string($conn, $_POST['edit_id']);
    $name = $grow['name'];

    $edit_growDetails = "UPDATE grow_details
                 SET datePlanted = '$edit_datePlanted', 
                    strain = '$edit_strain', 
                    toMaturity = '$edit_toMaturity', 
                    type = '$edit_type', 
                    gender = '$edit_gender', 
                    medium = '$edit_medium', 
                    watts = '$edit_watts', 
                    lightType = '$edit_lightType' 
                 WHERE id = '$id'; ";

    $query_edit_growDetails = $conn->query($edit_growDetails);

    if($query_edit_growDetails) {
        echo '<p class="success" id="success">Successfully updated log for '.$name.'! <a class="refresh" href="journal.php">Refresh</a></p>';
    } else {
        echo '<p class="error" id="error">There was an error: '. $conn->error .'</p>';
    }
}
?>

【讨论】:

  • 你忘了一件事,就是为name也创建一个隐藏字段,因为这行没有意义$name = $grow['name'];
  • '>
【解决方案2】:

我认为您的问题在于提交处理程序中的以下行:

$name = $grow['name'];

我看不到这个$grow 的引用位置,但您应该将名称作为隐藏输入添加到表单中。这样处理程序就知道要更新哪个元组。例如:

<input type="hidden" value="<?php echo $grow['name']; ?>" name="grow_name">

然后您可以像访问表单中的任何其他数据一样访问它,即

$name = mysqli_real_escape_string($conn, $_POST['grow_name']);

更多建议:

  • 您应该使用带参数的预处理语句,而不是使用原始查询,这样更安全。
  • 不是按名称更新,而是按 ID 更新。即使名字也是独一无二的。一个 id 通常会有一个主键索引,从而使查询速度更快。
  • 代码实际上更新了数据库中的所有条目这一事实向我表明,您的处理程序实际上位于 for 循环内,这绝对不是您想要的,请将其移出。通过此更新,它可以工作,但如果您不将其移出循环,它将为每个元组启动一个查询。

最后@Carlos,@Riggsfolly,我不是要复制你的答案。只是觉得我可以更好地构建答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多