繁体   English   中英

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

[英]Placing data in MySQL database from form fields created on the fly

我有一个允许成员单击(+)符号的表单,它将在其中放置另一个表单字段。 他们基本上可以做到这一点。

我的问题是,如果他们这样做3次,然后填写全部3次,那么当我得到保存的数据时,它将在数据库中放置第一个字段,而不是其他字段。

这是我的代码:

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

<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>

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

<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>

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

$i=0;
$linkname = $_POST["recname"][0];
while($linkname != ""){
$linkname = $_POST["recname"][$i];
$linkurl = $_POST["reclink"][$i];
$linktype = $_POST["rectype"][$i];
$linkname = $res->real_escape_string($linkname);
$linkurl = $res->real_escape_string($linkurl);
$linktype = $res->real_escape_string($linktype);
$result299 = mysqli_query($res, "INSERT INTO user_links (linkname,linkurl,linktype,sort) VALUES ('$linkname','$linkurl','$linktype','0')");
$i++;
}

除了不将所有数据存储在数据库中(仅保存第一个数据)之外,所有其他方法都可以正常工作。 这就是我需要帮助的部分。

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

我测试了您的代码,到目前为止,如果我像这样使用它,它可以正常工作:

  $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对象的信息,因此我现在暂时跳过该信息。 但是,代码中有两个缺点:

您使用裸名而不是字符串引用发布键。

PHP将优雅地假定您将其表示为字符串,但是它将触发诸如Use of undefined constant recname - assumed 'recname' 将其括在引号中以使其整洁。

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

在检查$ 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>

就是说,我不明白为什么它只保存一个项目,除非您遇到了关键约束或我们无法从您共享的代码中假设其他事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM