php - 从数组中的一个查询中插入多行

标签 php mysql sql arrays pdo

<分区>

我有一个帖子的数组:

//this are arrays
$name    = $_POST["name"];
$age     = $_POST["age"];
$date    = $_POST["date"];

我在 PDO 中有一个插入查询:

$stmt = $db->prepare("INSERT INTO staff (name, age, address) VALUES (:name, :age, :address)");

我的问题是如何使用 php 生成/或实现如下所示的查询:

INSERT INTO staff (name, age, address) VALUES
($name[0], $age[0], $address[0]), ($name[1], $age[1], $address[1])... etc

我尽量保持低服务器负载。

最佳答案

准备好的语句是不可能的。

如果要在一个查询中插入可变数量的记录,则必须动态生成 SQL 查询,这样就不可能预先准备

如果您使用数据库驱动程序的 escape_string 函数(对于 MySQL 来说是 quote()),那么您可以构建查询并仍然获得准备语句提供的安全性你。

$query = "INSERT INTO table (a, b, c) VALUES";
$tuple = " ('%s', '%s', '%s'),";
foreach ($items as $item) {
    $a = $db->quote($item['a']);
    $b = $db->quote($item['b']);
    $c = $db->quote($item['c']);
    $query .= sprintf($tuple, $a, $b, $c);
}
$query = rtrim($query, ","); // Remove trailing comma
// Use the query...

附录:

如果您使用的是准备好的语句,那么您可以单独插入记录,而不必担心一次性插入它们。这实际上就是准备好的语句的全部要点。

与旧的 SQL 查询不同,它是一个一步过程,只是发送然后被遗忘...

$db->query("INSERT INTO table (a, b, c) VALUES ('a', 'b', 'c')");

...准备好的语句是一个两步过程。

首先,您创建准备好的语句。然后将该语句发送到数据库,告诉它“这是你应该期待的”。数据库通常还会优化查询以使其更快。然后,此步骤返回一个语句句柄(在 PHP 文档中通常称为 $stmt)。

$stmt = $db->prepare('INSERT INTO table (a, b, c) VALUES (:a, :b, :c)');

其次,使用此句柄,您可以继续插入内容:

foreach ($records as $record) {
    $stmt->execute(array(
        ':a' => $record['a'],
        ':b' => $record['b'],
        ':c' => $record['c'],
    ));
}

因为数据库已经知道会发生什么,所以它可以优化 INSERT 的速度,这意味着您不必经历我在本附录上面提到的内容。

维基百科实际上有一个 quite nice writeup准备好的陈述。

关于php - 从数组中的一个查询中插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16384605/

相关文章:

MySQL order by 分组后工作异常

sql - 插入新行时查看表会发生什么?

sql - 在 SQL 中查询 JSON

php - Laravel 5.5 FormRequest 自定义错误消息验证不起作用

php - 查询在正确执行时不获取数据

php - 在每个 URL 之前执行功能,然后在 Symfony 2.6 中重定向

javascript - 从 js 调用不同当前文件中的类

php - 将格式为 MM/DD/YYYY 的日期转换为 MySQL 日期

php - mysql php从表B中获取与表A中给定列不匹配的条目的最佳方法是什么

mysql - 更新字段设置为同一字段中行的值