我有一个帖子中的数组:
//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
我尝试将服务器负载降低。
答案 0 :(得分:3)
您可以准备相应的声明,例如:
$sql = "INSERT INTO staff (name, age, address) VALUES ";
$values = array();
for ($i = 1; $i <= $count; $i++) {
$values[] = "(:name$i, :age$i, :address$i)"
}
$stmt = $db->prepare($sql . implode(', ', $values));
但是,imho,你可能会在每一套价值观中匆匆忙忙。这对服务器来说并不是一个负担,你的代码会更简单。
答案 1 :(得分:3)
准备好的陈述是不可能的。
如果要在一个查询中插入可变数量的记录,则必须动态生成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准备好的陈述。
答案 2 :(得分:1)
如果您正在使用PDO,则应准备语句,并使用不同的值执行它:
$stmt = $db->prepare("INSERT INTO staff (name,age,address) VALUES (:name,:age,:address)");
for($i=0;$i<count($name);$i++)
{
$stmt->execute(array(
":name" => $name[$i],
":age" => $age[$i],
":address" => $address[$i]));
}
但是,如果您想将其放入单个查询中,则应使用$ db-&gt; exec():
$query = "INSERT INTO staff (name,age,address) VALUES ";
$values = array();
for($i=0;$i<count($names);$i++)
{
array_push($values, "('" . $name[$i] . "','" . $age[$i] . "','" . $address . "')");
}
$db->exec($query . implode("," . $values));
警告与准备和执行方法相反,此方法很容易受到攻击,因为它不会验证输入
答案 3 :(得分:0)
将delayed
关键字添加到插入(insert delayed ...
)以减少服务器负载,然后使用所有值循环遍历预准备语句。如果你进行大量的插入操作,MySQL会将其内部排队为单独的insert
语句,扩展语法只是语法糖。