我对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}}无论我添加多少行。
答案 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...
}
}
}
?>