动态 jQuery PHP 表单不会将 POST 数据发送到 PHP var

Posted

技术标签:

【中文标题】动态 jQuery PHP 表单不会将 POST 数据发送到 PHP var【英文标题】:Dynamic jQuery PHP form doesn't send POST data to PHP var 【发布时间】:2020-09-09 23:13:57 【问题描述】:

自从上次来这里已经过去了很多时间。

希望您一切都好,并提前感谢您的帮助。

所以我正在做一个简单的更新、删除、添加修改 mysql 数据库的 php 页面。

在这个“管理”页面中,我创建了一个长表格,并在其中放置了一个表格,显示从数据库中提取的实际结果(您可以在其中修改或删除单个声音),然后是另一个表格,允许您在其中添加新元素分贝。

我想为第二个表格创建一个动态表单,以使其更加优雅,因此我为此添加了 jQuery 代码。

我发现但无法解决的两个问题是:(1) 在表单/表格单元格的一列中,我使用了两个“收音机”输入以指示产品的可用性,但是,如果我创建一个名为“availableNew []”的元素数组,所有单选元素都具有相同的名称,因此,当我将新行添加到表单时,单选语音选择在不同行从一个输入切换到另一个输入,因为当您使用多个具有相同名称的无线电输入时会发生这种情况(所有无线电输入都被视为备选方案,而不是位于不同行的不同输入“是/否”) - 很抱歉解释问题的方式很糟糕,但我找不到更清晰的方法来解释它(2) 用于添加/删除的 jQuery 代码新行效果很好,但是当我“提交”表单时 - 使用 POST_[ ] 命令 - 页面仅发送那些未使用脚本添加的输入(另一方面,我收到来自表单第一行的数据) .

为了更清楚:我已将表/表单的第一行创建为 php 回显表/表单,因此仅从第二行添加元素我使用 jQuery 脚本。 比,当我向 PHP 发送/发布数据时,我只收到数组的第一个值(对应于表/表单的第一行),而不接收其他值(对应于 jQuery 添加的行)。

以下是我正在使用的部分代码:

第一部分(Jquery 代码)

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>

<script>
    $(document).ready(function()
        $("#add-row").click(function()

                        var dataNew = $("#dataNew").val();
                        var data = $("#data").val();
                        var counter = $("#countN").val();
                        counter++;

                        var markup = "<tr><td class='count'>" + counter + "<input type='hidden' id='countN' name='numN[]' value='" + counter + "'></td><td class='data'>" + dataNew + "<input type='hidden' id='data' name='todayN[]' value=" + data + "></td><td class='prod'><input type='text' id='prod' name='prodN[]' placeholder='Nuovo prodotto'></td><td class='var'><input type='text' id='var' name='varN[]' placeholder='Varietà'></td><td class='img'><input type='text' id='img' name='imgN[]' placeholder='Inserisci url della foto'></td><td class='available'><label class='choice' for='avaYnew'><input type='radio' id='avaYnew' name='availableN[]' value='yes' > Sì</label><label class='choice' for='avaNnew'><input type='radio' id='avaNnew' name='availableN[]' value='no' > No</label></td><td class='rows'><input type='button' class='delete-row' id='delete-row' value='Rimuovi'></td></tr>";

                        alert(markup);

                        $("#addProds").append(markup);
        );

                $("#delete-row").live('click', function(event) 
                $(this).parent().parent().remove();
                );
    );
</script>

第二部分(PHP 回显表单/表格代码)

<?php
            echo "<div>";
            echo "<form action=" . htmlspecialchars($_SERVER['PHP_SELF']) . " method='POST'>";

      //MOSTRA I RISULTATI
      $sqlMag = "SELECT * FROM elencoprodotti WHERE DATA = (SELECT MAX(DATA) FROM elencoprodotti) ORDER BY DATA DESC, PRODOTTO ASC";
      $resultMag = $conn->query($sqlMag);

      $count = 0;

      if (!empty($resultMag) && $resultMag->num_rows > 0) 

                echo "<br>Prodotti presenti nel database (ultimo aggiornamento al " . date("d.m.Y", strtotime($rowTit[0]))."):</div>";
                echo "<table>";
                echo "<thead><tr>";
                echo "<th>DB-ID</th>";
                echo "<th>N.</th>";
                echo "<th>Data</th>";
                echo "<th>Prodotto</th>";
                echo "<th>Varietà</th>";
                echo "<th>Foto</th>";
                echo "<th>Disponibilità</th>";
                echo "<th>Cancella</th>";
                echo "</tr></thead>";

      // output data of each row
            while($rowMag = $resultMag->fetch_assoc()) 
                $count++;

                        $AvailYes = $AvailNo = '';

                        if ((($rowMag["AVAILABLE"])) == "yes") 
                            $AvailYes = "checked";
                            $AvailNo = "";
                         else if ((($rowMag["AVAILABLE"])) == "no") 
                            $AvailYes = "";
                            $AvailNo = "checked";
                        

                echo "<tr>
                        <td class='id'>" . stripslashes($rowMag["ID"]) . "<input type='hidden' id='id' name='id-" .  stripslashes($count) . "' value=" . stripslashes($rowMag["ID"]) . "></td>
                        <td class='count'>" . stripslashes($count) . "<input type='hidden' id='count' name='num-" .  stripslashes($count) . "' value=" . stripslashes($count) . "></td>
                        <td class='data'>" . date("d-m-Y", strtotime(stripslashes($rowMag["DATA"]))) . "<input type='hidden' id='data' name='today-" . stripslashes($count) . "' value=" . $data . "></td>
                        <td class='prod'><input type='text' id='prod' name='prod-" . stripslashes($count) . "' value=" . stripslashes($rowMag["PRODOTTO"]) . "></td>
                        <td class='var'><input type='text' id='var' name='var-" . stripslashes($count) . "' value=" . stripslashes($rowMag["VARIETA"]) . "></td>
                        <td class='img'><a id='single_image' href=" . stripslashes(base64_decode($rowMag['FOTO'])) . " title=".stripslashes($rowMag["PRODOTTO"])."&nbsp;".stripslashes($rowMag["VARIETA"]).">
                            <img id='imageprod' PRODOTTO"])."&nbsp;".stripslashes($rowMag["VARIETA"])." src=" .stripslashes(base64_decode($rowMag['FOTO'])). "></a>
                            <br><input type='hidden' id='img' name='img-" . stripslashes($count) . "' value=" . stripslashes(base64_decode($rowMag['FOTO'])) . "></td>
                        <td class='available'>
                        <label class='choice' for='avaY'><input type='radio' id='avaY' name='available-" . stripslashes($count) . "' value='yes' $AvailYes> Sì</label>
                        <label class='choice' for='avaN'><input type='radio' id='avaN' name='available-" . stripslashes($count) . "' value='no' $AvailNo> No</label>
                        </td>
                        <td class='delete'>
                        <label class='choice' for='del'><input type='checkbox' id='del' name='del-" . stripslashes($count) . "' value='canc'> rimuovi</label></td>
                        </tr>";
              
          echo "</table>";
                echo "<input type='hidden' id='count' name='maxrows' value=" . stripslashes($count) . ">";
                echo "<br>";

                $insN = 1;
                echo "<input type='hidden' id='insN' name='insN' value=" . stripslashes($insN) . ">";
                //$insN++;
                echo "<div>";
                echo "<br>Inserisci nuovi prodotti nel database:</div>";
                echo "<table id='addProds'>";
                echo "<thead><tr>";
                echo "<th>N.</th><th>Data</th><th>Prodotto</th><th>Varietà</th><th>Foto</th><th>Disponibilità</th><th>+/-</th>";
                echo "</tr></thead>";
                echo "<tr>";
                echo "<td class='count'>" . stripslashes($insN) . "<input type='hidden' id='count' name='numN[]' value=" . stripslashes($insN) . "></td>
                <td class='data'>" . date("d-m-Y", strtotime(stripslashes($data))) . "<input type='hidden' id='data' name='todayN[]' value=" . $data . "><input type='hidden' id='dataNew' name='todayNew[]' value=" . date("d-m-Y", strtotime(stripslashes($data))) . "></td>
                <td class='prod'><input type='text' id='prod' name='prodN[]' placeholder='Nuovo prodotto' value=''></td>
                <td class='var'><input type='text' id='var' name='varN[]' placeholder='Varietà' value=''></td>
                <td class='img'><input type='text' id='img' name='imgN[]' placeholder='Inserisci url della foto' value=''></td>
                <td class='available'>
                <label class='choice' for='avaYnew'><input type='radio' id='avaYnew' name='availableN[]' value='yes' > Sì</label>
                <label class='choice' for='avaNnew'><input type='radio' id='avaNnew' name='availableN[]' value='no' > No</label>
                </td>
                <td class='rows'><input type='button' class='add-row' id='add-row' value='Aggiungi riga'></td>
                </tr>
                </table>";
                echo "<input type='hidden' id='countN' name='insN' value=" . stripslashes($insN) . ">";
                //echo "<input type='hidden' id='countTotN' name='maxNewrows' value=" . stripslashes($insN) . ">";

                echo "<br><div class='button-section'><input type='submit' class='mod' name='Sign Up' value='Modifica' /></div>";
                echo "</form>";
           else 
                    echo "<p>Nessun risultato presente nel database - <a href='...viewdbadmin.php'>aggiorna la pagina</a>.</p></div>";
                    echo "</form>";
                

    mysqli_close($conn);
        echo "</div>";
?>

第三部分(PHP接收数据并循环抛出数组插入数据库)

<?php
        //da qui INSERT DATA
        if (!empty($_POST["prodN"])) 

            echo "<br>*************************** QUINDI prodN[] NON E' EMPTY **************************************<br>";
            // FAI UN LOOP TRA TUTTE LE RIGHE NEW

            $numR = $_POST['numN'];
            var_dump($numR);
            echo "<br>";
            //echo "<br>*************************** numR = $numR **************************************<br>";
            $dataR = $_POST['todayN'];
            var_dump($dataR);
            echo "<br>";
            //echo "<br>*************************** todayN = $dataR **************************************<br>";
            $prodR = $_POST['prodN'];
            var_dump($prodR);
            echo "<br>";
            //echo "<br>*************************** prodR = $prodR **************************************<br>";
            $varR = $_POST['varN'];
            var_dump($varR);
            echo "<br>";
            //echo "<br>*************************** varR = $varR **************************************<br>";
            $imgR = $_POST['imgN'];
            var_dump($imgR);
            echo "<br>";
            //echo "<br>*************************** imgR = $imgR **************************************<br>";
            $availableR = ($_POST['availableN']);
            var_dump($availableR);
            echo "<br>";
            echo "<br>*************************** availableR = $availableR **************************************<br>";
            for ($r=0; $r<count($prodR); $r++) 
            if ($numR[$r] != "" && $dataR[$r] != "" && $prodR[$r] != "" && $varR[$r] != "" && $imgR[$r] != "" && $availableR[$r] != "") 
                    //insert function
                    require_once('datainsert.php');
                    insertProds($conn, $numR[$r], $dataR[$r], $prodR[$r], $varR[$r], $imgR[$r], $availableR[$r]);
                    
                
//END
        
?>

我完全确定这不是我编写的优雅代码,但非常适合我需要的目的,所以请善待,因为我不是专业程序员,我这样做是一种挑战给我父母。

提前感谢您的时间和帮助。

更新1

在等待答案时,我尝试了两种可能的不同解决方案。

第一个是简单地移动页面底部的所有代码(我的想法是“也许我是位置问题”,但你猜怎么着?没有任何区别。

第二个是尝试另一个涉及 jQuery 和 Ajax POST 方法的代码,所以我使用了这个代码:

<script>
     $(document).ready(function()
                var i = 1;
                $("#add-row").click(function()
                        i++;

                        var dataNew = $("#dataNew").val();
                        var data = $("#data").val();
                        //var counter = $("#countN").val();
                        //alert("counter è:"+counter);
                        //counter++;

                        var markup = '<tr id="row' + i + '"><td class="count">' + i + '<input type="hidden" id="countN" name="numN[]" value=' + i + '></td><td class="data">' + dataNew + '<input type="hidden" id="data" name="todayN[]" value=' + data + '></td><td class="prod"><input type="text" id="prod" name="prodN[]" placeholder="Nuovo prodotto"></td><td class="var"><input type="text" id="var" name="varN[]" placeholder="Varietà"></td><td class="img"><input type="text" id="img" name="imgN[]" placeholder="Inserisci url della foto"></td><td class="available"><label class="choice" for="avaYnew"><input type="radio" id="avaYnew" name="availableN[]" value="yes" > Sì</label><label class="choice" for="avaNnew"><input type="radio" id="avaNnew" name="availableN[]" value="no" > No</label></td><td class="rows"><input type="button" name="delete-row" class="delete-row" id='+ i +' value="Rimuovi"></td></tr>';

                        alert(markup);
                        $("#addProds").append(markup);

                        //$("#countTotN").val(counter);
                        //var countTotN = $("#countTotN").val();
                        //$("#countN").val(counter);
         );

                $(document).on("click", ".delete-row", function() 
                    var button_id = $(this).attr("id");
                    altert(button_id);
                    $('#row' + button_id + '').remove();
                );

                $('#submit').click(function() 
                    $.ajax(
                        url:"viewdbadmin.php']",
                        method:"POST",
                        data:$('#items').serialize(),
                        success:function(data) 
                            alert(data);
                            $('#items')[0].reset();
                        
                );
     );
    );
 </script>

因此,PHP 一直运行良好,但 jQuery 附加数据一直被排除在包含发送到 PHP 的数据的数组之外。 事实上,我一直只收到我在表单中为新产品插入的第一个数据(表格第一行的数据),但任何附加的数据。

再次感谢,我希望有人能出现,因为我一周以来一直在测试这部分代码,但我无法找到解决方案。

抱歉,我添加了一个答案,以询问我如何才能更有用地获得您的帮助。 我怎样才能? 谢谢。

【问题讨论】:

【参考方案1】:

解决方案

不知道为什么,但它不起作用,因为里面有这一行就在桌子之前:

echo "<br>Prodotti presenti nel database (ultimo aggiornamento al " . date("d.m.Y", strtotime($rowTit[0]))."):</div>";

这部分表格用于显示用于更新的最后日期。 将这一行移到外面解决了这个问题。

所以现在的代码是(我希望它可以帮助其他人):

      $sqlTit = "SELECT DATA FROM elencoprodotti WHERE DATA = (SELECT MAX(DATA) FROM elencoprodotti) ORDER BY DATA DESC LIMIT 1";
      $resultTit = $conn->query($sqlTit);

      if (!$resultTit) 
          echo 'Could not run query: ' . mysqli_error($conn);
          exit;
      
            $rowTit = mysqli_fetch_row($resultTit);
            $lastUpd = date("d.m.Y", strtotime($rowTit[0]));

            echo "<div>";

            if (empty($lastUpd)) 
                echo "<br>Ultimo aggiornamento prodotti:<font color='red'> non disponibile</font></div>";
             else 
                echo "<br>Prodotti presenti nel database (ultimo aggiornamento al " . $lastUpd ."):</div>";
            


            echo "<form action=" . htmlspecialchars($_SERVER['PHP_SELF']) . " method='POST'>";

      //MOSTRA I RISULTATI
      $sqlMag = "SELECT * FROM elencoprodotti WHERE DATA = (SELECT MAX(DATA) FROM elencoprodotti) ORDER BY DATA DESC, PRODOTTO ASC";
      $resultMag = $conn->query($sqlMag);

      $count = 0;

      if (!empty($resultMag) && $resultMag->num_rows > 0) 

                echo "<table>";

【讨论】:

在代码中使用die(mysqli_error($conn)); 是一个非常糟糕的主意,因为它可能会泄露敏感信息。更多解释见这篇文章:mysqli or die, does it have to die?

以上是关于动态 jQuery PHP 表单不会将 POST 数据发送到 PHP var的主要内容,如果未能解决你的问题,请参考以下文章

PHP、动态表单、访问 POST 变量、复选框

将多个动态表单存储到对象中并使用jquery post方法发布和上传

使用 jQuery AJAX 向所需的 PHP POST 请求处理程序提交表单不起作用

无法发送“POST”表单,jQuery 不会检测到提交动作

jQuery/PHP 动态表单提交

使用 jQuery 和 PHP 序列化和提交表单