【问题标题】:Dynamic jQuery PHP form doesn't send POST data to PHP var动态 jQuery PHP 表单不会将 POST 数据发送到 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' alt=".stripslashes($rowMag["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 的数据的数组之外。 事实上,我一直只收到我在表单中为新产品插入的第一个数据(表格第一行的数据),但任何附加的数据。

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

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

【问题讨论】:

    标签: php jquery forms dynamic


    【解决方案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?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2014-04-09
    • 2017-04-23
    • 2016-02-05
    • 2017-12-11
    • 2014-04-01
    相关资源
    最近更新 更多