【问题标题】:How can I insert a lot of records into database all at once from a textarea where every line of it is a record?如何从每行都是记录的文本区域一次将大量记录插入数据库?
【发布时间】:2021-02-03 20:00:27
【问题描述】:

我正在运行一个针对医学生的网站,我的数据库中的每个学生都有个人资料和积分,所以当他们参与一项活动时,我必须为所有参与者添加 X 点数,我这样做手动使用 ajax 表单,如何运行 MySQL 查询以在大型文本输入 (textarea) 中为每个学生提供 X 点数?所以我可以一次插入所有点,这样更容易更快,下面是一个例子:

21910431|1|Participant
22010431|3|Subleader
21810531|6|Headleader
(Student ID)|(points)|(role in activity)

所以当我用上面的数据填充 textarea 时,它必须将 3 条记录插入到 activity_log 表中。 如何一次将其全部插入数据库?像这样:

$query= "INSERT INTO `activity_log` (`Student ID`, `points`, `role`) VALUES (ALL THE VALUES IN THE EXAMPLE ABOVE)";

如果有人能帮忙,你能写下代码告诉我怎么做吗?非常感谢!

【问题讨论】:

  • 语法为:VALUES (data for row 1), (data for row 2), ...。使用循环将此表单添加到您的查询中。
  • 在新行上爆炸,然后在管道上爆炸。迭代行数据的新行爆炸,然后通过管道获取列值。参数化查询。
  • 由于您还应该使用准备好的语句,因此使用 PDO 是最简单的。您可以将? 占位符放入查询中,然后将所有值作为数组放入execute() 调用中。
  • @Barmar 为什么是循环?
  • @ysth 或者将所有值放在一个数组中并使用implode()

标签: php mysql sql


【解决方案1】:

使用 PDO:

$lines = explode("\n", $_POST['textarea']); // split into lines
$params = [];
foreach ($lines as $line) {
    if ($line) {  // skip blank lines
        $params += explode('|', $line); // split each line into individual values
    }
}
# Make all the (?, ?, ?) that go after VALUES
$values = implode(',', array_fill(0, count($params)/3, '(?, ?, ?)')); 
$query= "INSERT INTO `activity_log` (`Student ID`, `points`, `role`) VALUES $values";
$stmt = $conn->prepare($query);
$stmt->execute($params);

【讨论】:

    【解决方案2】:

    您可以插入多行:

    INSERT INTO `activity_log` (`Student ID`, `points`, `role`) VALUES (21910431,1,'Participant'),(22010431,3,'Subleader'),...;
    

    使用占位符,这将是:

    INSERT INTO `activity_log` (?,?,?),(?,?,?),...;
    

    只是传递所有要执行的值。

    【讨论】:

    • 你能写一个将值传递给查询的代码吗?它可能会达到 100-150 个值,可以吗?
    • 看起来像 Barmar。总查询必须小于服务器 @@max_allowed_pa​​cket 设置,但这通常至少是一兆字节
    猜你喜欢
    • 2013-06-03
    • 2020-10-06
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多