尝试设置动态html表单以使用pdo将数组插入数据库。 没有添加新的输入字段,它工作正常。一旦我添加字段,我就会收到错误,说我的数组是空的。
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>
更新:
由于数组不允许相同的密钥,我改变了我的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 :(得分:1)
默认情况下,php将匿名输入数组放入分隔的项目中,这就是你用id和name发布2个输入的原因,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();
}
}
以这种方式创建两个数组,一个只包含id,另一个只包含名称,然后将它们组合到一个数组中,该数组将id放在key上,并将值命名为value。有了它,你可以在一个循环中执行foreach并检索id和名称。