2013-03-13 91 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'); 

确保新输入元素的形式元素内追加。显然,还有很多代码需要编写。这只是这些概念的一个基本例子。

相关问题