如何修复未正确提交的数组中的表单数据

时间:2019-06-01 18:00:36

标签: php

我正在构建一个管理表单,该表单允许其他团队更新其自身数据的各个方面,因此他们不必致电我为他们做这些事情。

它们通过复选框或文本字段更新数据。还要求他们能够一次编辑多行。因此,表单要求他们选择要更新或已更新的行。到目前为止一切都很好。

因此,我的问题是:如果第一个记录选中了一个复选框,第二个记录选中了3个复选框,则在提交表单并回显数据时,第一个记录显示3个值,第二个记录显示1个值,指示记录1本身已经从记录2中获取了值。我知道情况并非如此,但无法弄清楚为什么数据没有保留在记录2中。

我绕过这个问题,搜索并找到了许多应该起作用的示例,但是它们只是使用单个文本字段而不是复选框。所以,我希望这里的人可以帮助我解决问题。

<?php
    if(isset($_POST['updateRecord'])) {
        // echo "Update Record Outer Check<br>";
        if ((strtolower($_POST['updateRecord']) == "update")) {
            foreach ($_POST['update'] as $key => $update) {
                $id = $_POST['id'][$key];
                $regOK = (
                    isset($_POST['regOK'][$key]) ?
                    $_POST['regOK'][$key] : false
                );
                $paidOK = (
                    isset($_POST['paidOK'][$key]) ?
                    $_POST['paidOK'][$key] : false
                );
                $ebdOK = (
                isset($_POST['ebdOK'][$key]) ?
                    $_POST['ebdOK'][$key] : false
                );
                $appOK = (
                isset($_POST['appOK'][$key]) ?
                    $_POST['appOK'][$key] : false
                );
                echo "RECORD ID: ".$id."<br>";
                echo " REG: ".$regOK."<br>";
                echo "PAID: ".$paidOK."<br>";
                echo " EBD: ".$ebdOK."<br>";
                echo " APP: ".$appOK."<br><br>";
            }
        }
    }
    echo "<br><br>";
?>
<style type="text/css">
    th,td {text-align:center;}
</style>
<form action="" method="post" name="theForm">
    <table cellpadding="2" cellspacing="0" class="resultsTable">
        <tr>
            <th>REG</th>
            <th>PAID</th>
            <th>EBD</th>
            <th>APP</th>
            <th>Update Record</th>
        </tr>
        <tr>
            <td><input type="checkbox" name="regOK[]" id="regOK" value="1" checked></td>
            <td><input type="checkbox" name="paidOK[]" id="paidOK" value="1"></td>
            <td><input type="checkbox" name="ebdOK[]" id="ebdOK" value="1"></td>
            <td><input type="checkbox" name="appOK[]" id="appOK" value="1"></td>
            <td>
                <input type="checkbox" class="test" name="update[]" id="update" value="1">
                <input type="hidden" name="updateRecord[]" id="updateRecord" value="update">
                <input type="hidden" name="id[]" id="id" value="1"  />
            </td>
        </tr>
        <tr>
            <td><input type="checkbox" name="regOK[]" id="regOK" value="1" checked></td>
            <td><input type="checkbox" name="paidOK[]" id="paidOK" value="1"></td>
            <td><input type="checkbox" name="ebdOK[]" id="ebdOK" value="1"></td>
            <td><input type="checkbox" name="appOK[]" id="appOK" value="1"></td>
            <td>
                <input type="checkbox" class="test" name="update[]" id="update" value="2">
                <input type="hidden" name="updateRecord[]" id="updateRecord" value="update">
                <input type="hidden" name="id[]" id="id" value="2"  />
            </td>
        </tr>
        <tr>
            <td><input type="checkbox" name="regOK[]" id="regOK" value="1"></td>
            <td><input type="checkbox" name="paidOK[]" id="paidOK" value="1"></td>
            <td><input type="checkbox" name="ebdOK[]" id="ebdOK" value="1"></td>
            <td><input type="checkbox" name="appOK[]" id="appOK" value="1"></td>
            <td>
                <input type="checkbox" name="update[]" id="update" value="3">
                <input type="hidden" name="updateRecord" id="updateRecord" value="update">
                <input type="hidden" name="id[]" id="id" value="3"  />
            </td>
        </tr>
        <tr><td colspan="5" ><input type="submit" name="updateFormData" id="updateFormData" value="Update All Records"></td></tr>
    </table>
</form>

选中前两个复选框。不理会第1行,并选中记录2的第二个复选框,选择前两行的更新复选框,然后提交表单。我希望看到的是:

记录ID:1 REG:1 已付: EBD: APP:

记录ID:2 REG:1 付费:1 EBD: APP:

在这个例子中我得到的是: 记录ID:1 REG:1 付费:1 EBD: APP:

记录ID:2 REG:1 已付: EBD: APP:

您可以看到第一条记录显示第二行数据的位置。

2 个答案:

答案 0 :(得分:1)

检查此。我在这里做什么:

    通过只编写一次代码并将html呈现在循环中,
  1. 防止代码耦合和人为错误
  2. id直接分配给表单数据并简化调试步骤
  3. 更具可读性和更漂亮的代码,并清除不必要的行

    <?php
        $ids = range(1, 3); // [1, 2, 3];
        $true = "true";
        $false = "false";
    
        if(isset($_POST['update'])) {
            foreach ($_POST['update'] as $id => $update) {
                if ($_POST['update'][$id]) {
                    $regOK = isset($_POST['regOK'][$id]) ? $true : $false;
                    $paidOK = isset($_POST['paidOK'][$id]) ? $true : $false;
                    $ebdOK = isset($_POST['ebdOK'][$id]) ? $true : $false;
                    $appOK = isset($_POST['appOK'][$id]) ? $true : $false;
    
                    echo "RECORD ID: ".$id."<br>";
                    echo " REG: ".$regOK."<br>";
                    echo "PAID: ".$paidOK."<br>";
                    echo " EBD: ".$ebdOK."<br>";
                    echo " APP: ".$appOK."<br><br>";
                }
            }
        }
        echo "<br><br>";
    ?>
    <style type="text/css">
        th,td {text-align:center;}
    </style>
    <form action="" method="post" name="theForm">
        <table cellpadding="2" cellspacing="0" class="resultsTable">
            <tr>
                <th>REG</th>
                <th>PAID</th>
                <th>EBD</th>
                <th>APP</th>
                <th>Update Record</th>
            </tr>
            <?php foreach($ids as $id) { ?>
            <tr>
                <td><input type="checkbox" name="regOK[<?=$id?>]" id="regOK" value="1" checked></td>
                <td><input type="checkbox" name="paidOK[<?=$id?>]" id="paidOK" value="1"></td>
                <td><input type="checkbox" name="ebdOK[<?=$id?>]" id="ebdOK" value="1"></td>
                <td><input type="checkbox" name="appOK[<?=$id?>]" id="appOK" value="1"></td>
                <td><input type="checkbox" class="test" name="update[<?=$id?>]" id="update" value="1"></td>
            </tr>
            <?php } ?>
            <tr><td colspan="5" ><input type="submit" name="updateFormData" id="updateFormData" value="Update All Records"></td></tr>
        </table>
    </form>
    

答案 1 :(得分:0)

代码中的错误正在建立索引,使用索引处理表单会解决

<?php
    if(isset($_POST['updateRecord'])) {
        // echo "Update Record Outer Check<br>";
        if ((strtolower($_POST['updateRecord']) == "update")) {
            foreach ($_POST['update'] as $key => $update) {
                $id = $_POST['id'][$key];
                $regOK = (
                    isset($_POST['regOK'][$key]) ?
                    $_POST['regOK'][$key] : false
                );
                $paidOK = (
                    isset($_POST['paidOK'][$key]) ?
                    $_POST['paidOK'][$key] : false
                );
                $ebdOK = (
                isset($_POST['ebdOK'][$key]) ?
                    $_POST['ebdOK'][$key] : false
                );
                $appOK = (
                isset($_POST['appOK'][$key]) ?
                    $_POST['appOK'][$key] : false
                );
                echo "RECORD ID: ".$id."<br>";
                echo " REG: ".$regOK."<br>";
                echo "PAID: ".$paidOK."<br>";
                echo " EBD: ".$ebdOK."<br>";
                echo " APP: ".$appOK."<br><br>";
            }
        }
    }
    echo "<br><br>";
?>
<style type="text/css">
    th,td {text-align:center;}
</style>
<form action="" method="post" name="theForm">
    <table cellpadding="2" cellspacing="0" class="resultsTable">
        <tr>
            <th>REG</th>
            <th>PAID</th>
            <th>EBD</th>
            <th>APP</th>
            <th>Update Record</th>
        </tr>
        <tr>
            <td><input type="checkbox" name="regOK[]" id="regOK" value="1" checked></td>
            <td><input type="checkbox" name="paidOK[]" id="paidOK" value="1"></td>
            <td><input type="checkbox" name="ebdOK[]" id="ebdOK" value="1"></td>
            <td><input type="checkbox" name="appOK[]" id="appOK" value="1"></td>
            <td>
                <input type="checkbox" class="test" name="update[]" id="update" value="1">
                <input type="hidden" name="updateRecord[]" id="updateRecord" value="update">
                <input type="hidden" name="id[]" id="id" value="1"  />
            </td>
        </tr>
        <tr>
            <td><input type="checkbox" name="regOK[1]" id="regOK" value="1" checked></td>
            <td><input type="checkbox" name="paidOK[1]" id="paidOK" value="1"></td>
            <td><input type="checkbox" name="ebdOK[1]" id="ebdOK" value="1"></td>
            <td><input type="checkbox" name="appOK[1]" id="appOK" value="1"></td>
            <td>
                <input type="checkbox" class="test" name="update[1]" id="update" value="2">
                <input type="hidden" name="updateRecord[1]" id="updateRecord" value="update">
                <input type="hidden" name="id[]" id="id" value="2"  />
            </td>
        </tr>
        <tr>
            <td><input type="checkbox" name="regOK[2]" id="regOK" value="1"></td>
            <td><input type="checkbox" name="paidOK[2]" id="paidOK" value="1"></td>
            <td><input type="checkbox" name="ebdOK[2]" id="ebdOK" value="1"></td>
            <td><input type="checkbox" name="appOK[2]" id="appOK" value="1"></td>
            <td>
                <input type="checkbox" name="update[2]" id="update" value="3">
                <input type="hidden" name="updateRecord" id="updateRecord" value="update">
                <input type="hidden" name="id[]" id="id" value="3"  />
            </td>
        </tr>
        <tr><td colspan="5" ><input type="submit" name="updateFormData" id="updateFormData" value="Update All Records"></td></tr>
    </table>
</form>