2016-12-06 83 views
0

尝试设置动态html表单以将数组插入数据库与pdo。 不添加新的输入字段,它工作正常。只要我添加字段,我会收到错误,说我的数组是空的。php pdo动态html表单插入数组

PHP代码:

if(isset($_POST['submit'])) 
{ 
    $items = (isset($_POST['items']) && is_array($_POST['items'])) ? $_POST['items'] : array(); 

    $insertStmt = $db->prepare("INSERT INTO products (prod_id, type) VALUES (:id, :name)"); 
    foreach ($items as $item) 
    { 
     $insertStmt->bindValue(':id', $item['id']); 
     $insertStmt->bindValue(':name', $item['name']); 
     $insertStmt->execute(); 
    } 
} 

jQuery代码:

$(document).ready(function() { 
    var max_fields  = 10; 
    var wrapper   = $(".input_fields_wrap"); 
    var add_button  = $(".add_field_button"); 

    var x = 1; 
    $(add_button).click(function(e) 
    { 
     e.preventDefault(); 
     if(x < max_fields) 
     { 
      x++; //text box increment 
      $(wrapper).append('<div>Product ID<input type="text" name="items[][id]"/><br>Product Name<input type="text" name="items[][name]"/><a href="#" class="remove_field">Remove</a></div>'); 
     } 
    }); 

    $(wrapper).on("click",".remove_field", function(e) 
    { 
     e.preventDefault(); $(this).parent('div').remove(); x--; 
    }) 
}); 

的html代码:

<form action="" method="POST"> 
    <div class="input_fields_wrap"> 
    <button class="add_field_button">Add Product</button> 
    <div>Product<input type="text" name="items[][id]"></div> 
    <div>Product Name<input type="text" name="items[][name]"></div> 
    </div> 
    <button type="submit" name="submit" class="inner">Save workout</button> 
</form> 

UPDATE:

因为数组不允许我改变了相同的密钥我的JavaScript。

$(wrapper).append('<div>Product ID<input type="text" name="items['+x+'][id]"/><br>Product Name<input type="text" name="items['+x+'][name]"/><a href="#" class="remove_field">Remove</a></div>'); 

也是表单输入。

<div>Product<input type="text" name="items[0][id]"></div> 
<div>Product Name<input type="text" name="items[0][name]"></div> 
+0

它说你的数组是空的? 我建议在PHP的顶部尝试'var_dump($ items)'来查看数组是否按照您期望的方式来到 – Joundill

+0

@Joundill Error1:未定义索引:名称Erro2:完整性约束违规:1048列'name'不能为null''insertStmt-> bindValue(':name',$ item ['name']);' – mypoint

+0

数组通过vardump传入。 – mypoint

回答

1

默认情况下,PHP把输入匿名数组到分隔的项目,这对你发布的内容2个输入,ID和名称和PHP的原因解释为4个项目组成的数组,这样你的foreach将循环4而不是2,而且你永远无法在同一个循环中捕获id和name。

最好的解决办法是把和号码每一个输入群组,如:

items[0][id] 
items[0][name] 

items[1][id] 
items[1][name] 

看到这个职位的进一步信息:How to POST data as an indexed array of arrays (without specifying indexes)

但是,有一个其他的方式才达到你希望没有定义索引号,它只需要你反转你输入数组中的名称,如下所示:

从:items[][id]到:items[id][]

和:items[][name]到:items[name][]

和你的PHP应该是:

if(isset($_POST['submit'])) 
{ 
    $items = (isset($_POST['items']) && is_array($_POST['items'])) ? $_POST['items'] : array(); 

    $array_ids = $items['id']; 
    $array_names = $items['name']; 
    $array_items = array_combine($array_ids, $array_names); 

    $insertStmt = $db->prepare("INSERT INTO products (prod_id, type) VALUES (:id, :name)"); 
    foreach ($array_items as $id => $name) {   
     $insertStmt->bindValue(':id', $id); 
     $insertStmt->bindValue(':name', $name); 
     $insertStmt->execute();   
    } 
} 

创建两个数组,一个只包含IDS和只含名字一个方式,然后你将它们组合成一个数组,该数组将id放在键上并将其命名为value。有了这个,你可以做你的foreach,并在一个循环中检索id和名字。

+0

谢谢!它的工作原理,除了问题,如果数组的键相同。 如果我想输入:[1] => keyboard [1] => case [2] => speaker' 它只会输入'[1] => case' – mypoint