php 提交查询时多字段表单放错值

sgtfey8w  于 2023-02-03  发布在  PHP
关注(0)|答案(1)|浏览(103)

我正在处理一个多字段表单来注册问题,但是当提交数据到mysql数据库时,它错放了复选标记值。第一次提交得到1值,其余的得到0和下面的错误消息:
警告:第97行的C:\xampp\htdocs\panel_gastos\v1.3\ingreso_problemas.php中的数组键1未定义**
屏幕显示如下:

下面是在mySQL中提交的结果:第一个元素应该具有“recurrente=1”和“resuelto=0”

代码如下所示:

<?php
session_start();
?>

<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport", content="width=device-width, initial-scale=1.0">
        <title>Portal gastos - ingreso de problemas</title>
        <!---Bootstrap-->
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
        <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.min.js" integrity="sha384-cuYeSxntonz0PPNlHhBs68uyIAVpIIOZZ5JqeqvYYIcEL727kskC66kF92t6Xl2V" crossorigin="anonymous"></script>
        <!---JQuery-->
        <script src="https://code.jquery.com/jquery-3.6.3.min.js" integrity="sha256-pvPw+upLPUjgMXY0G+8O0xUf+/Im1MZjXxxgOcBQBXU=" crossorigin="anonymous"></script>
        <!---añadir filas--->
        <script type="text/javascript">
            $(document).ready(function(){
                var html = '
                    <tr>
                        <td>
                            <input class="form-control" type="text" name="Prob[]" required="">
                        </td>
                        <td><!---<input type="hidden" name="Recurrente[]" value="0"/>--->
                            <input class="primary" type="checkbox" name="Recurrente[]" value="1">
                        </td>
                        <td>
                            <input class="form-control" type="text" name="KPI[]" >
                        </td>
                        <td>
                            <input type="date" name="Fecha[]" required="">
                        </td>
                        <td>
                            <input type="hidden" name="Solucionado" value="0">
                            <input type="checkbox" name="Solucionado[]" value="1">
                        </td>
                        <td>
                            <input class="btn btn-danger" type="button" name="remove" id="remove" value="remove">
                        </td>
                    </tr>';
               
                var max = 15;
                var x = 1;

                $('#add').click(function(){
                    if(x < max){
                        $("#table-field").append(html);
                        x++;
                    }
                });

                $('#table-field').on('click','#remove' ,function(){
                    $(this).closest('tr').remove();
                    x--;
                });
            });
        </script>
    </head>
   
 <body>

        <div class="container">
            <form class="insert-form" id="insertform" method="post" action="">
                <hr>
                    <h1 class="text-center">input field</h1>
                <hr>
                    <div class="input-field">
                        <table class="table table-bordered" id="table-field">
                            <!---encabezados--->
                            <tr>
                                <th>Prob</th>
                                <th>Rec</th>
                                <th>KPI</th>
                                <th>fecha suceso</th>
                                <th>solucionado</th>
                                <th>add/remove</th>
                            </tr>

                            <!---enviar data--->
                            <?php 
                                $bdd= new PDO("mysql:host=localhost;dbname=test_usuarios; charset=utf8mb4", "root", "");
                                $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

                                if (isset($_POST['save'])){
                                    $createtime = date('Y-d-m');
                                    $usr = $_SESSION["username"];
                                    $ceco = $_SESSION['ceco'];
                                    $problema = $_POST['Prob'];
                                    $recurrente = $_POST['Recurrente'];
                                    $kpi_sol = $_POST['KPI'];
                                    $fecha_sol = $_POST['Fecha'];
                                    $solucionado = $_POST['Solucionado'];

                                    foreach($problema as $key=>$value){
                                        $save= <<<SQL
                                                INSERT INTO incidentes_cecos(fecha_creacion, usr, ceco, problema, recurrente, KPI_sol, fecha_evento, resuelto)
                                                VALUES('$createtime','$usr', '$ceco','$value','$recurrente[$key]','$kpi_sol[$key]','$fecha_sol[$key]','$solucionado[$key]');
                                                SQL;
                                        $query = $bdd->query($save);
                                    };
                                }
                            ?>
                            <!---campos--->
                            <tr>
                                <td><input class="form-control" type="text" name="Prob[]" required=""></td>
                                <td><!---<input type="hidden" name="Recurrente[]" value="0"/>---><input class="primary" type="checkbox" name="Recurrente[]" value="1"></td>
                                <td><input class="form-control" type="text" name="KPI[]" ></td>
                                <td><input type="date" name="Fecha[]" required=""></td>
                                <td><input type="hidden" name="Solucionado" value="0"><input type="checkbox" name="Solucionado[]" value="1"></td>
                                <td><input class="btn btn-warning" type="button" name="add" id="add" value="add"></td>
                            </tr>
                        </table>
                        <center>
                            <input class="btn btn-success" type="submit" name="save" id="add" value="save data">
                        </center>
                    </div>
            </form>
        </div>
    </body>
</html>

到目前为止,我已经尝试了一些解决方案,如果复选框被选中,发送1,如果没有,发送0。我不知道发生了什么,最有可能的是我的数组使用不当。

sdnqo3pr

sdnqo3pr1#

<input type="hidden" name="Solucionado[]" value="0">
<input type="checkbox" name="Solucionado[]" value="1">

即使隐藏字段的名称已修复,以便与复选框的名称匹配,但当您有多个同名复选框时,也不能使用此解决方案。
如果你有

<input type="hidden" name="Foobar" value="0">
<input type="checkbox" name="Foobar" value="1">

则此解决方案有效-因为PHP会覆盖具有相同名称的参数,所以$_POST['Foobar']将包含隐藏字段提交的0(如果未选中复选框),以及1(如果选中复选框)(因为01将以相同名称提交,并且后一个1将覆盖前一个0)。
但是如果你的字段名中有[],PHP不会覆盖它,而是用所有提交的值创建一个数组。这当然是你想要的文本字段的行为--但是它会阻止这个复选框的工作。
因为,如果你有上面的隐藏输入加复选框,比如说,三次,但你只选中其中一个复选框-那么仍然会导致 * 四 * 值被提交:三个隐藏的输入都提交了它们的0,而一个选中的复选框提交了它的1,所以,你又一次不能正确地将它与你的文本字段值关联起来。
这里唯一可行的解决方案是,你先显式地指定该值在结果数组中的索引,你的第一个文本输入将命名为name="Prob[0]",复选框为name="Solucionado[0]",下一组字段为[1],依此类推,隐藏字段将被完全删除。
由于使用JavaScript动态地追加表单字段,因此需要修改该部分以保留计数器,并相应地修改相关位置的输出。
然后可以循环$_POST['Prob'],然后对于每个条目检查$_POST['Solucionado']中是否存在具有相同索引的条目。
但是,由于您需要对表单的创建方式进行修改,因此将字段名更改为name="data[0][Prob]"name="data[0][Solucionado]"之类的名称可能更有意义,然后您将首先获得按数字索引组织的$_POST['data']中的所有数据,然后获得ProbSolucionado、等等,在那下面-与Solucionado仍然只存在,如果相应的复选框被选中。但数据分组更合乎逻辑的开始。

相关问题