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

Php 如何修复数组中未正确提交的表单数据,php,Php,我正在构建一个管理表单,允许其他团队更新他们自己数据的各个方面,这样他们就不必打电话给我来为他们做这件事 它们通过复选框或文本字段更新数据。还有一个要求是他们能够一次编辑多行。因此表单要求他们选择要更新或已经更新的行。到目前为止还不错 因此,我的问题是:如果第一条记录选中了一个复选框,而第二条记录选中了3个复选框,那么在提交表单并回显数据时,第一条记录显示3个值,而第二条记录显示1,表明记录1以某种方式从记录2中获取了值。我知道事实并非如此,但我不明白为什么数据没有保留在记录2中 我已经绕过了这

我正在构建一个管理表单,允许其他团队更新他们自己数据的各个方面,这样他们就不必打电话给我来为他们做这件事

它们通过复选框或文本字段更新数据。还有一个要求是他们能够一次编辑多行。因此表单要求他们选择要更新或已经更新的行。到目前为止还不错

因此,我的问题是:如果第一条记录选中了一个复选框,而第二条记录选中了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>

th,td{text align:center;}
规则
支付
EBD
应用程序
更新记录
将选中前两个复选框。保留第1行,选中记录2的第二个复选框,选择前两行的更新复选框,然后提交表单。我希望看到的是:

记录编号:1 注册:1 支付: EBD: 应用程序:

记录编号:2 注册:1 薪酬:1 EBD: 应用程序:

我在这个例子中得到的是: 记录编号:1 注册:1 薪酬:1 EBD: 应用程序:

记录编号:2 注册:1 支付: EBD: 应用程序:


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

代码中的错误是索引,使用索引处理表单将解决它

<?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>

th,td{text align:center;}
规则
支付
EBD
应用程序
更新记录

检查此项。我在这里所做的:

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

    <?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>
    
    
    th,td{text align:center;}
    规则
    支付
    EBD
    应用程序
    更新记录
    
    表单中不包括未选中的复选框。这就是为什么会出现未定义的索引错误以及输出不正确的原因。您需要找到一种方法,以可预测的方式处理复选框。也许考虑Ajax?我不太熟悉PHP,但是HTML格式很多。所有复选框都具有相同的名称和ID真的可以吗?接收到的数据不是只以这种方式显示最新的输入吗?@Bman70 only
    updateRecord
    正在覆盖,但在该代码示例中它是不相关的。名称中的括号表示它是一个多选输入,PHP将其视为一个数组。