嵌套输入字段(父结构和子结构)

时间:2011-05-11 13:52:43

标签: php webforms parent-child

我处在一个非常棘手的情况,我有一个允许输入记录的页面,并且有一个父/子结构(如果你调用它,则记录/子记录)。当用户需要添加更多记录/子记录时,可以动态添加许多记录/子记录(在下一行之后克隆并插入行)。

结构

<div class="row">
   <strong>Parent record:</strong> <input type="text" name="parent-record[]" />
   <div class="row">
       <strong>Child record:</strong> <input type="text" name="child-record[]" />
   </div>
   <span class="add-subrecord">Add another sub-record</span>
</div>
<span class="add-record">Add another record</span> 

PHP方面的问题,当我有2个for循环时,1个在for循环中,如下所示:

for($i = 0; $i < count($_POST['parent-record']); $i++)
{
    $sql = "INSERT INTO records (input) VALUES ('" . $_POST['parent-record'][$i] . "')";
    $result = $db->sql_query($sql);

    $parent_id = $db->sql_nextid(); // mysql_insert_id

    for($j = 0; $j < count($_POST['child-record']); $j++)
    {
        $sql = "INSERT INTO records (input, parent) VALUES('" . $_POST['child-record'][$j] . "', '" . $parent_id . "')"; // this will also insert the $parent_id into this record because this record is a child of a parent.
        $result = $db->sql_query($sql);
    }
}

但是,当进程完成后,每个孩子都有第一个主记录的父级,即使我添加了2-3个记录(不是子记录)所以喜欢:

+------+---------+----------+
| id   | input   | parent   |
+------+---------+----------+
| 1    | random  | 0        | <- indicates it is a parent
| 2    | random1 | 1        | <- child record, parent is record id: 1
| 3    | random2 | 1        | <- child record, parent is record id: 1
| 4    | random3 | 1        | <- this should be a parent, but it's added as a child
| 5    | random4 | 1        | <- this one too
+------+---------+----------+

在创建所有子节点都具有记录块的父ID的嵌套输入表单时,我需要某种解决方案。

3 个答案:

答案 0 :(得分:2)

也许你可以用这种方式更改表单输入的名称:

<div class="row">
  <strong>Parent record:</strong> <input type="text" name="parent-record[1]" />
  <div class="row">
    <strong>Child record:</strong> <input type="text" name="parent-record[1]child-record[]" />
  </div>
  <span class="add-subrecord">Add another sub-record</span>
</div>
<span class="add-record">Add another record</span> 

我假设您正在使用javascript添加新输入。您可以使用上面的名称,但增加数字。

在PHP post数组中,每个父项都应该有一个子记录数组。

答案 1 :(得分:1)

您的问题在于您迭代记录的方式。首先插入第一个父记录。然后,您迭代所有子记录 - 包括属于不同父项的子记录。例如,请使用以下用户输入:

parent1
  child1a
  child1b
parent2
  child2a

这将生成以下$ _POST数组:

$_POST['parent-record'] = array('parent1', 'parent2');
$_POST['child-record'] = array('child1a', 'child1b', 'child2a');

因此,您可以看到,在将parent1插入数据库之后,然后插入所有子记录,这些记录错误地将parent1指定为child2a的父级。

您需要一种方法来确定哪些孩子属于哪个孩子。

AND REMEMBER 在将用户输入插入SQL查询之前对其进行编码!!

$sql = "INSERT INTO records (input) VALUES ('" . mysql_real_escape_string($_POST['parent-record'][$i]) . "')";

答案 2 :(得分:-1)

看一下代码的最后一部分:

for($j = 0; $j < count($_POST['child-record']); $i++)
    {
        $sql = "INSERT INTO records (input, parent) VALUES('" . $_POST['child-record'][$j] . "', '" . $parent_id . "')"; // this will also insert the $parent_id into this record because this record is a child of a parent.
        $result = $db->sql_query($sql);
    }

我认为应该是:

 for($j = 0; $j < count($_POST['child-record']); $j++)
    {
        $sql = "INSERT INTO records (input, parent) VALUES('" . $_POST['child-record'][$j] . "', '" . $parent_id . "')"; // this will also insert the $parent_id into this record because this record is a child of a parent.
        $result = $db->sql_query($sql);
    }

j ++而不是i ++