我处在一个非常棘手的情况,我有一个允许输入记录的页面,并且有一个父/子结构(如果你调用它,则记录/子记录)。当用户需要添加更多记录/子记录时,可以动态添加许多记录/子记录(在下一行之后克隆并插入行)。
结构:
<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的嵌套输入表单时,我需要某种解决方案。
答案 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 ++