代码之家  ›  专栏  ›  技术社区  ›  TheOrdinaryGeek

形成MySQL数据库的输入数组

  •  2
  • TheOrdinaryGeek  · 技术社区  · 6 年前

    我有一个html表单,允许用户将设备添加到数据库中。一个用户可以添加多个设备项,有时设备之间唯一不同的字段是 存货编号 MAC地址 .

    例如,他们可能希望添加10台具有相同硬件的Dell PC。他们可以动态地添加 存货编号 MAC地址 领域。

    表单输入如下所示;

    <form method="POST" action="">
        <input type="text" name="make">
        <input type="text" name="model">
        <input type="text" name="inv[]">
        <input type="text" name="mac[]">
        <input type="submit" name="submit">
    </form>
    

    我可以提交表格,输出 print_r($_POST) 是;

    Array
    (
        [make] => Dell
        [model] => Optiplex
        [inv] => Array
            (
                [0] => 1544778
                [1] => 3344558
                [2] => 1644758
                [3] => 9844558
            )
        [mac] => Array
            (
                [0] => 8877445
                [1] => 3311554
                [2] => 7788445
                [3] => 3214857
            )
    )
    

    在上面的例子中,我需要创建 mysql数据库中的单独记录。

    考虑到我需要循环这些值并分别插入它们,我有以下PHP;

    $arr_inv = $_POST['inv'];
    $arr_mac = $_POST['mac'];
    
    for ($i = 0; $i < count($arr_inv); $i++) {
        $sql = "INSERT INTO table (make, model, inv, mac)
        VALUES ('" . $make . "', '" . $model . "', '" . $arr_inv[$i] . "','" . $arr_mac[$i];
        $stmt = DB::exec($sql);
    }
    

    虽然这样做确实有效,并将4个单独的记录插入到数据库中,但这是最好的方法吗/我怎样才能使它更有效?

    请忽略代码的任何安全缺陷,仍在处理它。任何建议都很感激。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Bogdan Vakuliuk    6 年前

    基本上,可以将所有行合并为一行 INSERT 查询的确切语法可能取决于您使用的数据库,但一般来说,它应该如下所示:

    INSERT INTO table (make, model, inv, mac)
    VALUES
    (make1, model1, inv1, mac1),
    (make2, model2, inv2, mac2)
    

    如果您必须执行大量查询,这将显著提高性能。

    升级版。 正如@Vatev公平地建议的那样,我删除了代码示例,因为它不包含任何数据转义和验证,因此可能会在某个项目中造成潜在的漏洞,所以我只留下一般的想法描述。