动态 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的主要内容,如果未能解决你的问题,请参考以下文章