使用jQuery动态添加表单元素并使用PHP提交到数据库

时间:2013-04-12 09:59:21

标签: php jquery

我对jQuery相对较新,我遇到了使用jQuery动态添加表单元素然后使用PHP迭代这些表单元素以添加到数据库的问题。

基本上我拥有的是一个表,在单击div时,会添加一个包含表单元素的新表行。代码如下所示:

$('.addRow1').click(function() {
      <?php $count++; ?>
       $('.mainTable > tbody:last').one().append('<tr><td>Chronic Pain Referral</td><td>Chronic referral</td><td><input type="hidden" name="count" value="<?php echo $count; ?>"><textarea name="notes"></textarea></td></tr>');
    });

正如您所看到的,我尝试使用PHP添加计数器,因此每次添加行时都会添加1 to $count然后我只需执行foreach()语句来迭代表单数据对于每一行。

然而这不起作用。如果我尝试将foreach()与计数器一起使用,则会出现服务器错误,如果我只是添加了大量表行并单击submit,则在打印计数器值时,它总是以{ {1}}无论我添加多少行。

3 个答案:

答案 0 :(得分:1)

在将页面发送到客户端之前,PHP代码<?php $count++; ?>在服务器上执行;当JavaScript函数触发时它不会执行。您需要使用 JavaScript 变量进行增量字段计数。

另外,在您的表单中,您只会重复一个名为&#34; count&#34;的字段的实例。随着值的增加,文本区域的实例称为&#34; notes&#34;。 &#34;计数&#34;字段将毫无意义,因为您无法将它们与文本区域相关联(表单字段不保证按表单的任何特定顺序提交。)

您可能希望将计数附加到动态字段上的字段名称,以便能够知道哪些字段连续排在一起。然后,您可以迭代表单处理程序中的已发布字段,并使用字段名称末尾的索引将相关字段匹配在一起。我已多次这样做了,这有点棘手,但绝对可行。

另一种解决方案是命名您的文本区域&#34; notes []&#34;而不是&#34;笔记&#34;。然后,在您的表单处理程序中,$_REQUEST['notes']将是所有&#34;注释&#34;的数组。表单中的字段。如果只有一个动态字段可以处理,这样可以正常工作;但是,如果每个动态添加的行都有多个相互关联的字段,那么您将无法确定哪些字段连续排在一起。在这种情况下,您必须将索引附加到表单字段名称。

答案 1 :(得分:0)

据我所知,PHP脚本在服务器端执行,代码<?php $count++; ?>不会在循环中执行。它将在服务器端执行一次。您将不得不反过来,在PHP脚本中迭代列表并相应地附加事件。

我没有PHP技能,因此无法提供代码示例。

希望这有帮助。

答案 2 :(得分:0)

PHP代码在发送到浏览器之前只在服务器端执行,您需要使用javascript获取行数。

尝试这样的事情:

var cnt = $('.mainTable > tbody > tr').length + 1;
var row = '<tr><td>Chronic Pain Referral</td><td>Chronic referral</td><td><input type="hidden" name="count" value="' + cnt + '"><textarea name="notes"></textarea></td></tr>';

现在,如果您要一次提交所有行,则需要在每行的字段名称中添加[]。这告诉PHP数据是一个数组。这可能是您使用foreach时出现错误的地方,您没有将它传递给数组。

<textarea name="notes[]"></textarea>

然后,当您在PHP中获得表单提交时,您不需要计数,只需执行:

<?php
if (!empty($_POST['notes'])) {
  foreach ($_POST['notes'] as $note) {
     ...
  }
}
?>

阿德里安的一个例子:

<textarea name="notes_"' + cnt + '"></textarea>

PHP:

<?php
if (!empty($_POST)) {
  foreach ($_POST as $key => $value) {
    $pieces = explode('_', $key);
    $field = $pieces[0];
    if ($field == 'notes') {
      $row = $pieces[1];          
      // Process data... 
    }
  }
}
?>