【问题标题】:php pdo dynamic html form insert arrayphp pdo 动态 html 表单插入数组
【发布时间】:2016-12-06 22:54:32
【问题描述】:

尝试设置动态 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>

【问题讨论】:

  • 哪一行是说你的数组是空的?我建议在 PHP 顶部尝试 var_dump($items) 以查看数组是否按照您期望的方式出现
  • @Joundill Error1:未定义索引:名称 Erro2:违反完整性约束:1048 列“名称”不能为空”$insertStmt-&gt;bindValue(':name', $item['name']);
  • Array 正在使用 vardump。

标签: php jquery html


【解决方案1】:

默认情况下,php 将匿名输入数组放入单独的项目中,这就是您发布 2 个带有 id 和 name 的输入的原因,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 上,将 name 放在 value 上。这样,您就可以进行 foreach 并在一个循环中检索 id 和 name。

【讨论】:

  • 谢谢!它可以工作,除非数组组合的键相同。如果我想输入:[1] =&gt; keyboard [1] =&gt; case [2] =&gt; speaker 它只会输入[1] =&gt; case
猜你喜欢
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 2019-01-24
  • 2012-08-25
  • 2013-10-01
  • 2017-10-20
相关资源
最近更新 更多