【问题标题】:insert multiple rows into database via form通过表单将多行插入数据库
【发布时间】:2012-07-03 08:25:50
【问题描述】:

在 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']

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

【问题讨论】:

  • 使用implode() PHP 函数,它允许您只用一条 SQL 语句插入多行..
  • “但这不起作用” - 嗯......显然。由于多种原因,您的 PHP 代码显然是错误的 - 但我想这只是因为您发布了伪代码,对吧?您收到什么错误消息?
  • 是的,我没有收到任何错误,因为我只是在我的数据库中输入了名称字段的最后一个实例,因为它具有相同的名称。

标签: php mysql


【解决方案1】:

你可以使用php数组,所以你这样做

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

注意名称后添加的方括号。您可以在表单中有多个 this 实例,然后在 php 中将其引用为:

$_POST['name'][$i]

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

【讨论】:

  • 谢谢,这很有帮助,谢谢。我需要一个 ( 在 for 之后,所以它看起来像这样 for ($1=0; 现在我已经这样做了,我没有收到任何错误,但数据仍然没有保存在数据库中。有人可以在这里选择任何语法错误吗?或者也许我需要再看一下 for 循环吗?
  • 我建议你在 for 循环完成后输出 $sql 的值并在此处发布。我猜有一些小的语法错误,当我们看到 $sql 的值时会很明显。
【解决方案2】:

@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。)

在您的提交接收脚本中,使用以下 sn -p 来:

  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();
    }
}

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多