准备好的语句是不可能的。
如果要在一个查询中插入可变数量的记录,则必须动态生成 SQL 查询,这使得事先无法准备。
如果您使用数据库驱动程序的escape_string
功能(quote()
适用于 MySQL),那么您可以构建查询并仍然获得准备好的语句为您提供的安全性。
$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')");
...准备好的陈述是一个两步的过程。
首先,您创建准备好的语句。然后这个语句被发送到数据库,告诉它“这是你应该期待的”。数据库通常还会优化查询以使其更快。然后,此步骤会返回一个语句句柄(通常$stmt
在 PHP 文档中调用)。
$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
s 的速度,这意味着您不必经历我在本附录上面提到的内容。
维基百科实际上有一个相当不错的准备好的陈述。