微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 从一个数组中的一个查询中插入多行[复制]

参见英文答案 > PDO Prepared Inserts multiple rows in single query                                    20个
我有一个帖子的数组:

//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个准备好的陈述.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐