通过表单将多行插入数据库

时间:2012-07-02 22:12:15

标签: php mysql

在php中,我可以使用下面的

在我的数据库中添加多行
$sql = 'INSERT INTO 'tablename' ('column1', 'column2') VALUES
    ('data1', 'data2'),
    ('data3', 'data4'),
    ('data5', 'data6'),
    ('data7', 'data8');
';

但我无法弄清楚如何创建一个允许我在数据库中添加多行的表单。

在过去,当我只想一次添加一行时,我能够在我的表单中做到这样的事情。

<input type="text" name="name" value="">

以及我的php下面的

$_POST['name']

但是当您要插入多行时,这不起作用。有人可以指点我在正确的方向吗?

2 个答案:

答案 0 :(得分:3)

你可以使用php数组,所以你可以

<input type="text" name="name[]" value="">

请注意名称后添加的方括号。你可以在表单中有多个这样的实例,然后在php中引用它:

$_POST['name'][$i]

其中$ i是索引数组中值的变量。

因此,您可以将插入语句更改为

$sql = 'INSERT INTO \'tablename\' (\'column1\', \'column2\') VALUES';
for ($i=0; $i<count($_POST['name']); $i++) {
    $sql .= '(\'' . $_POST['name'][$i] . '\', \'' . $_POST['something'][$i] . '\')';
    if ($i<count($_POST['name']) - 1) {
       $sql .= ',';
    }
}

假设您的表单中有第二个输入类型,称为“某事”,其定义为

<input type="text" name="something[]" value="">

答案 1 :(得分:1)

@HexAndBugs的答案错误地引用了查询中的表名和列。反引号应替换这些单引号。也就是说,即使语法得到纠正,查询仍然是不安全且不稳定的。像Seamus O'Brien这样的条目将导致脚本失败,更不用说该查询容易受到更险恶的注入攻击。出于任何原因,任何人都不应使用该答案。

这是一个完整的解决方案,假设您的表单仅包含名称字段:

<input type="text" name="name[]">
<input type="text" name="name[]">
...repeat as many times as you like inside the form

由于提交旨在将数据写入数据库,因此POST是合适的方法。 (仅在打算从数据库中获取/读取数据时才应使用GET。)

在您的提交接收脚本中,使用以下代码段:

  1. 检查是否有包含name数据的提交。
  2. 使用带有绑定参数的预处理语句和迭代执行来提高稳定性/安全性。我将不包括清理步骤,因为我不知道您的要求,但是建议这样做是为了使您的数据库数据保持干净。

代码:

if (!empty($_POST['name'])) {
    $conn = new mysqli("localhost", "root", "", "yourDB");  //apply your credentials
    $stmt = $conn->prepare("INSERT INTO `tableName` (`name`) VALUES (?)");
    $stmt->bind_param('s', $name);
    foreach ($_POST['name'] as $name) {
        // to sanitize the name string, perform that action here
        // to disqualify an entry, perform a conditional continue to avoid the execute call
        $stmt->execute();
    }
}