从动态创建的表单字段中将数据放入MySQL数据库中

时间:2016-11-19 01:41:32

标签: php mysql

我有一个允许成员点击(+)符号的表单,它会在那里放置另一个表单字段。他们可以基本上无限制地做到这一点。

我遇到的问题是,如果他们这样做,让我们说3次并填写所有3,当我得到数据保存它时,它将第一个字段放在数据库中不是其他人。

这是我的代码:

这是在他们按下(+)符号时使div显示的JavaScript。

$.globals.socket.on

这是执行上述操作的表单的一部分......

<script type="text/javascript">
function add_feed()
{
    var div1 = document.createElement('div');
    div1.innerHTML = document.getElementById('newlinktpl').innerHTML;
    document.getElementById('newlink').appendChild(div1);
}
</script>
<style>
   .feed {padding: 5px 0}
</style>

这是PHP代码的一部分,可以保存它......

<td width="50%" valign="top">
<div id="newlink">
<div class="feed">
<input type="text" size="45" value="" name="recname[]" placeholder="Place Company Name Here"><br /><br />
<input type="text" size="45" value="" name="reclink[]" placeholder="Place URL Here"><br /><br />
<p><b>What Type Of Page Is This?</b><br /><br />
<input type="radio" name="rectype[]" value="1"> Business Opp<br />
<input type="radio" name="rectype[]" value="2"> Traffic Site<br />
<input type="radio" name="rectype[]" value="3"> Tools Site<br /></p>
</div>
</div>
<hr>
<p id="addnew">
<a href="javascript:add_feed()">+ Click Here To Add Another Biz/Traffic/Tools Site</a>
</p>
<div id="newlinktpl" style="display:none">
<hr>
<div class="feed">
<input type="text" size="45" value="" name="recname[]" placeholder="Place Company Name Here"><br /><br />
<input type="text" size="45" value="" name="reclink[]" placeholder="Place URL Here"><br /><br />
<p><b>What Type Of Page Is This?</b><br /><br />
<input type="radio" name="rectype[]" value="1"> Business Opp<br />
<input type="radio" name="rectype[]" value="2"> Traffic Site<br />
<input type="radio" name="rectype[]" value="3"> Tools Site<br /></p>
</div>
</div>

除了不存储数据库中的所有数据(只保存第一个数据)之外,所有工作都在工作。这是我需要帮助的部分。

请解释我做错了什么以及如何将其存储在数据库中的所有字段,无论用户创建和填写多少字段。

1 个答案:

答案 0 :(得分:2)

我测试了你的代码,如果我像这样使用它,它可以正常工作:

  $i=0;
  $linkname = $_POST[recname][0];
  while($linkname != ""){
    $linkname = $_POST[recname][$i];
    $linkurl = $_POST[reclink][$i];
    $linktype = $_POST[rectype][$i];
    echo "INSERT INTO user_links (linkname,linkurl,linktype,sort) VALUES ('$linkname','$linkurl','$linktype','0')<br>\n";
    $i++;
  }

没有关于你正在调用real_escape_string()的$ res对象的信息,所以我现在就跳过它。但是代码中有一些缺点:

您正在使用barename而不是字符串引用post键。

PHP会优雅地假设您将其视为字符串,但它会触发Use of undefined constant recname - assumed 'recname'之类的通知。将它们括在引号中以使其清洁。

您对循环的使用将导致每次都在数据库中插入一个空元素。

在检查$ linkname是否为空之后设置新的linkname,但该变量包含最后一次迭代的名称。相反,做这样的事情:

$i=0;
while($linkname = $_POST["recname"][$i]){
    $linkurl = $_POST["reclink"][$i];
    $linktype = $_POST["rectype"][$i];
    echo "INSERT INTO user_links (linkname,linkurl,linktype,sort) VALUES ('$linkname','$linkurl','$linktype','0')<br>\n";
    $i++;
}

您的代码只允许一次检查一个单选按钮

您无法使用rectype[]作为单选按钮的名称,因为相同的名称会在所有元素中形成一组单选按钮。你需要这样命名:

<input type="radio" name="rectype[0]" value="1"> Business Opp<br />
<input type="radio" name="rectype[0]" value="2"> Traffic Site<br />
<input type="radio" name="rectype[0]" value="3"> Tools Site<br />

<input type="radio" name="rectype[1]" value="1"> Business Opp<br />
<input type="radio" name="rectype[1]" value="2"> Traffic Site<br />
<input type="radio" name="rectype[1]" value="3"> Tools Site<br />

等等。你可以在你的javascript代码中以编程方式执行此操作:

<script type="text/javascript">
var counter = 1;

function add_feed()
{
    var div1 = document.createElement('div');
    div1.innerHTML = document.getElementById('newlinktpl').innerHTML;
    var inputs = div1.getElementsByTagName('input');
    for (i=0; i<inputs.length; i++) {
      if (inputs[i].type == "radio") {
        inputs[i].name="rectype[" + counter + "]";
      }
    }
    counter++;
    document.getElementById('newlink').appendChild(div1);
}
</script>

那就是说,我不明白为什么它只能保存一个项目,除非你有一个关键约束命中或我们不能从你共享的代码中假设的其他东西。