2011-05-11 48 views
1

我處於一個非常棘手的情況,我有一個允許輸入記錄的頁面,並且存在父/子結構(如果您稱之爲記錄/子記錄) 。多條記錄/子記錄可以動態添加當用戶需要增加更多的(行被克隆和下一行之後插入)。嵌套的輸入字段(父子結構)

結構

<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,這將如何工作。

回答

1

你的問題出在方法您正在迭代記錄。您首先插入第一個父記錄。然後,你遍歷所有孩子 records-- 包括屬於不同的家長孩子的記錄。例如,採取以下用戶輸入:

parent1 
    child1a 
    child1b 
parent2 
    child2a 

,這將產生以下$ _POST數組:

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

所以,你可以看到,你插入parent1到數據庫後,你再插入所有的子記錄,它錯誤地分配parent1child2a的母公司。

您需要一種確定哪些孩子屬於哪個父母的方法。

AND REMEMBER在將您的用戶輸入插入SQL查詢之前對其進行編碼!

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

我不完全確定如何以某種方式實現排序功能... *我知道清潔輸入 - 它只是一個代碼演示* – MacMac 2011-05-11 15:23:47

+0

@lolwut您可以爲每個組的名稱添加一個唯一編號。例如,第一個父項將被命名爲「parent-record-0」。 「parent-record-0」的孩子的名字是「child-record-0-0」,「child-record-0-1」等。 – Michael 2011-05-11 15:40:24

+0

@lolwut實際上,子記錄可以是數組。因此,第一個父項將被命名爲「parent-record-0」,其子項記錄將被命名爲「child-record-0 []」。第二個父母將被命名爲「父記錄-1」,其子記錄將被命名爲「child-record-1 []」。等等 – Michael 2011-05-11 15:49:50

-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 ++而不是我++

+0

這是一個錯字。仍然無法工作。 – MacMac 2011-05-11 14:08:22

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後陣列中的每個家長都應該有孩子記錄的數組。