2013-03-13 90 views
0

add another item添加的形式另一個項目/行,插入DB

這兩個字段被插入到數據庫中。但是,我想讓用戶能夠「添加另一個項目」。理想情況下,他們應該能夠添加儘可能多的項目。當他們提交表單時,數據將被插入到一個mysql表中。

我該如何去做這件事?在我的數據庫中創建10個額外的列以容納添加的額外項目聽起來不現實也不理想。

感謝您的幫助!

這裏是我的代碼,在那裏我插入我的數據到數據庫的一個片段:

if ($stmt = $mysqli->prepare("INSERT items (number, description) VALUES (?, ?)")) 
          { 
            $stmt->bind_param("ss", $number, $description); 
            $stmt->execute(); 
            $stmt->close(); 
          } 
+1

你的代碼?你可以把它張貼在jsfiddle上嗎? – 2013-03-13 21:39:43

+0

在你的數據庫中創建額外的列?你肯定是做錯了,搜索一些'數據庫規範化'教程 – 2013-03-13 21:41:18

+0

@MehdiKaramosly編輯我的文章 – Alex 2013-03-13 21:42:14

回答

0

只需使用:

name="item[]" 

的項目#'

name="description[]" 

<input type="text" name="item[]" /><input type="text" name="description[]" /> 

對於項目descripti在現場和你的服務器端迭代通過它們。前端的 只需創建一個複製該節點多次的腳本。

編輯

根據你表明,它應該類似於下面的代碼的東西代碼:

if(isset($_POST['item']){ 
for($i = 0; $i < count($_POST['item']); $i++){ 
$number = $_POST['item'][$i]; 
$description= $_POST['description'][$i]; 
if ($stmt = $mysqli->prepare("INSERT items (number, description) VALUES (?, ?)")) 
          { 
            $stmt->bind_param("ss", $number, $description); 
            $stmt->execute(); 
            $stmt->close(); 
          } 
} 

在JavaScript做象下面這樣:

function addRow(){ 
    document.getELementById('container').el.innerHTML += '<input type="text" name="item[]" /><input type="text" name="description[]" />' ; 
} 

HTML代碼:

<form name='myform' > 

<div id="container"> 
<input type="text" name="item[]" /><input type="text" name="description[]" />  
</div> 
    <p onclick="addRow() ;" >Add another item</p> 
</form> 

我希望這有助於。

UPDATE

試試這個:

if(isset($_POST['item']){ 

if ($stmt = $mysqli->prepare("INSERT items (number, description) VALUES (?, ?)")) 
{ 
    for($i = 0; $i < count($_POST['item']); $i++){ 
    $number = $_POST['item'][$i]; 
    $description= $_POST['description'][$i]; 

            $stmt->bind_param("ss", $number, $description); 
            $stmt->execute(); 

    } 
    $stmt->close(); 

} 
+0

如果我沒有其他物品,它工作正常。但是,如果我添加更多的項目,我得到'警告:mysqli :: prepare()[mysqli.prepare]:無法爲添加的每個附加項目獲取mysqli'。一個項目被添加到數據庫中,但是任何其他項目都不是,並且會收到提及的錯誤。 – Alex 2013-03-13 23:33:45

+0

@Alex在我剛剛添加的UPDATE中嘗試一下。 – 2013-03-13 23:44:37

+0

完美!謝謝。 – Alex 2013-03-13 23:53:10

1

這是一個非常複雜的問題,但也有一些非常簡單的解決方案。首先,您需要更改用於處理可變數量項目的後端PHP腳本。

例如,現在,你可能有這樣的:

$item_number = $_POST['item_number']; 
$item_description = $_POST['item_description']; 
add_item_to_db($item_number, $item_description); 

你需要改變你的代碼來處理項目的數組的處理:

$item_numbers = $_POST['item_number']; 
$item_descriptions = $_POST['item_description']; 
// validate that count($item_numbers) == count($item_descriptions) 
for ($i = 0; $i < count($item_numbers); $i++) { 
    add_item_to_db($item_numbers[$i], $item_descriptions[$i]); 
} 

有相當一些錯誤處理,你需要執行上面沒有顯示。如果用戶輸入不同於item_descriptions的item_number數量,則必須確定如何處理該數量。另外,任何字段可能都是空白的。有些情況可能是錯誤的,有些則可能不是。

你必須改變你的HTML:

<input type="text" name="item_number[]" /> 
<input type="text" name="item_description[]" /> 

注意在名稱中[]。這爲每個指定了一個數組值。

最後,你需要動態地添加輸入一組新項目在屏幕上時,用戶按下添加其他項目鏈接。我會建議爲此使用jQuery。要做到這一點,你會做這樣的事情:

jQuery('<input type="text" name="item_number[]" /><input type="text" name="item_description[]" />').appendTo('#someDiv'); 

確保新輸入元素的形式元素內追加。顯然,還有很多代碼需要編寫。這只是這些概念的一個基本例子。

相關問題