【问题标题】:Adding single hidden input value to each form input in ajax call将单个隐藏输入值添加到 ajax 调用中的每个表单输入
【发布时间】:2018-09-13 18:23:54
【问题描述】:

我有一个带有可以添加动态输入字段的按钮的表单,它正在创建一个 ajax 问题。我的 ajax 帖子给了我 500 个错误 但是我现在的控制台数据日志是这样的:

但我需要将这些插入为

insert into ticker_content (ticker_id, content)
     values (1, 'one'), (1, 'two');

如果这有意义的话。

所以基本上,问题是我在任何给定时间都有多个输入(包含文本值)和一个隐藏的输入,它给了我正确的股票代码 ID。

但是,我需要让我的数组包含每个元素都具有输入文本值和股票代码 ID。因此,对于创建和填充的每个输入,我还需要将该表单的隐藏输入的值分配给它,以便我可以将它们成对发送到我的 foreach 循环并插入。

这是我为插入而调用的 addticker.php:

$items = $_POST['Items'];
$tickerID = $_POST['tickerID'];

foreach ($items as $item){

    $addTicker = "
        INSERT INTO ticker_content (tickerID, content)
        values ('$tickerID', '$item');
     "
     $mysqlConn->query($addTicker);
}

所以基本上对于每个 Items[] 值,我都需要插入相同的隐藏字段。

这是我的表单和 JS 代码供参考。第一个JS块主要用于动态添加输入的功能,但最后一个JS块是ajax使用serializeArray();

<?php foreach($tickerDisplays as $key => $ticker):?>

    <form id="Items" method="post">   
        <label id="ItemLabel">Item 1: </label>
        <input type="text" name="Items[]"><br/> <!--form starts with one input-->
        <button type="button" class="moreItems_add">+</button> <!--button dynamically adds input, up to 10 per form-->

        <input type="hidden" name="tickerID" id="tickerID" class="tickerIdClass" value="<?php echo $ticker['ticker'] ?>"><!--hidden input used for tickerID-->
        <input type="submit" name="saveTickerItems" value="Save Ticker Items">  <!--submit button-->
    </form>

<?php endforeach;?>




<!-- This is the functionality for each form to click the '+' button and create new inputs -->
<script type="text/javascript">

$("button.moreItems_add").on("click", function(e) {
var tickerID = $(this).closest('form').find('.tickerIdClass').val(); //get value of hidden input for form
  var numItems = $("input[type='text']", $(this).closest("form")).length;
  if (numItems < 10) {
    var html = '<label class="ItemLabel">Item ' + (numItems + 1) + ': </label>';
    html += '<input type="text" name="Items[]"/><br/>';
    $(this).before(html);
    console.log(tickerID);
  }
});

</script>

<!-- This is the ajax call to send all filled out and created inputs from form along with the hidden input -->
<script type="text/javascript">
$("#Items").submit(function(e) {
    e.preventDefault();
    var data = $("#Items").serializeArray();
    console.log(data);

$.ajax({
       type: "POST",
       url: "addticker.php",
       data: $("#Items").serializeArray(), // serializes the form's elements.
       success: function(data)
       {
           alert(data); // show response from the php script.
       }
     });

});

</script> 

【问题讨论】:

  • addticker.php返回错误500,意思是:“内部服务器错误”,通常是由于PHP中的语法错误。我在查询字符串的末尾看到一个缺少的半列。当您收到错误 500 时,您通常可以在 PHP 错误日志中看到问题所在。您是否被警告过 SQL 注入?您的代码易受攻击。
  • 好的,很好。我添加了分号,当时得到了 200,但没有插入。有没有更好的方法可以测试页面或控制台上的结果?我只是觉得它不会像我期望的那样插入,尤其是有多个输入时
  • 添加半栏后的调试可以使用浏览器的开发者工具。请参阅:browserstack.com/developer-tools 转到“网络”选项卡并检查参数和输出以查看您的 ajax 调用做了什么。出于调试目的,您可能希望在 addticker.php 中回显某些内容以告诉自己发生了什么。
  • 就这样,非常感谢!

标签: javascript jquery arrays ajax


【解决方案1】:

首先,您的代码中缺少分号(这可能会导致您的 500 错误)。

其次,如果您想将表单中的所有字段捆绑为一个查询,以下将构建一个类似于您之前在问题中提到的查询:

INSERT INTO ticker_content (ticker_id, content) VALUES(1, 'one'), (1, 'two'), ...

$items = $_POST['Items'];
$tickerID = $_POST['tickerID'];

$addTicker = "INSERT INTO ticker_content (tickerID, content) values";
foreach ($items as $item){
    $addTicker .= "('$tickerID', '$item'),";
}
$addTicker = substr($addTicker, 0, -1); // Eat that last comma

$mysqlConn->query($addTicker);

您的 HTML 还需要一些工作,因为 id 属性在页面上应该是唯一的。由于您正在复制表单,因此您应该执行以下操作:

<form id="Items<?php echo $ticker['ticker']?>" class="tickerform" method="post">   

然后更新你的javascript:

// Using $(this) in Jquery allows you to access the 
// element that is making the method call (in this case, the form)
$(".tickerform").submit(function(e) {
    e.preventDefault();
    var data = $(this).serializeArray(); 
    console.log(data);
    $.ajax({
       type: "POST",
       url: "addticker.php",
       data: data, // Don't need to serialize again, 'var data' is still in scope.
       success: function(data)
       {
           alert(data); // show response from the php script.
       }
    });
});

【讨论】:

  • 好的,我实际上让它在同一个表单上处理多个字段!它为每个具有正确 ID 的记录插入了一条记录。但是,其他表单也有一个不起作用的提交按钮(可能是由于我的表单中的提交输入中的 id?)你能帮我吗?这样不管有多少形式,功能都是一样的?
  • 所以基本上,提交第一个表单在功能上工作正常,但我可能需要在提交按钮上进行计数或其他内容,以便它适用于每个表单
  • @Whisou138 更新了答案。
  • 你是最棒的!谢谢
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 1970-01-01
  • 2015-08-11
  • 2013-08-18
相关资源
最近更新 更多