您好,我正在制作一个在pdo中进行多次插入的类。
是这样的
INSERT INTO $table (key1,key2,key3,etc) VALUE (value1,value2,value3,etc), (value1,value2,value3,etc), (value1,value2,value3,etc)
搜索后,我发现我必须建立类似
INSERT INTO $table (key1,key2,key3,etc) VALUE (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc), (:key1,:key2,:key3,etc)
然后用这个执行$this->execute($data);
,其中$data
是
0 =>
array
'key1' => 'value1'
'key2' => 'value2'
'key3' => 'value3'
1 =>
array
'key1' => 'value1'
'key2' => 'value2'
'key3' => 'value3'
etc
问题是我还得到一个错误Array to string conversion
就$insert->execute($data);
如何解决呢?
这是我正在做的一小段。
public function multipleInsert($table, $data = array())
{
# INSERT (name) VALUE (value),(value)
if (count($data) > 1)
{
$fieldnames = array_keys($data[0]);
$count_inserts = count(array_values($data));
$count_values = count(array_values($data[0]));
# array(????) untill x from first data
for($i = 0; $i < $count_values; $i++)
{
$placeholder[] = '?';
}
# array((????),(????),(????)) for query
for ($i=0; $i < $count_inserts; $i++)
{
$placeholders[] = '('. implode(',',$placeholder) . ')';
}
$query = 'INSERT INTO '. $table;
$query .= '(`'. implode('`, `', $fieldnames) .'`)';
$query .= ' VALUES '. implode(', ', $placeholders);
$insert = $this->start->prepare($query);
$i = 1;
foreach($data as $item)
{
foreach ($item as $key => $value)
{
$insert->bindParam($i++, $item[$key]);
}
}
echo $query;
$insert->execute();
$return['status'] = true;
$return['lastid'] = $this->start->lastInsertId();
return $return;
}
else
{
die('$data is less then two array, use single insert instead.');
}
}
避免并发症的简单方法是这样的
$stmt = $pdo->prepare('INSERT INTO foo VALUES(:a, :b, :c)');
foreach($data as $item)
{
$stmt->bindValue(':a', $item[0]);
$stmt->bindValue(':b', $item[1]);
$stmt->bindValue(':c', $item[2]);
$stmt->execute();
}
但是,这将多次执行该语句。因此,最好创建一个较长的单个查询来执行此操作。
这是我们如何执行此操作的示例。
$query = "INSERT INTO foo (key1, key2) VALUES "; //Prequery
$qPart = array_fill(0, count($data), "(?, ?)");
$query .= implode(",",$qPart);
$stmt = $dbh -> prepare($query);
$i = 1;
foreach($data as $item) { //bind the values one by one
$stmt->bindValue($i++, $item['key1']);
$stmt->bindValue($i++, $item['key2']);
}
$stmt -> execute(); //execute
问题内容: 假设我有两个表,并且 我想在一个查询中将来自某些输入的数据插入到表中,该怎么做? 请,如果可以做到,请解释语法。 问题答案: MySQL不支持在单个INSERT语句中进行多表插入。奇怪的是,Oracle是我所知道的唯一一个…
我总共有10行这样的 PHP 我正在尝试在一个查询中插入数据库中的所有记录?我如何在一个查询中插入数据库中的所有行?
问题内容: 我需要用一个查询插入多行(行数不是常数),所以我需要像这样执行查询: 我知道的唯一方法是 但我想要一些更简单的方法。 问题答案: 我构建了一个程序,该程序将多行插入到位于另一个城市的服务器上。 我发现使用此方法的速度大约是的10倍。就我而言,tup是一个包含约2000行的元组。使用此方法大约花了10秒钟: 使用此方法需要2分钟:
问题内容: 我想编写脚本,具有对多个插入查询的功能。让我更好地解释一下。 我有一个html形式的输入。而且我有MySQL查询要插入到表中。所以我想让我的函数为“数量”次插入此查询。 例如要插入3次。有什么建议么? 问题答案: http://dev.mysql.com/doc/refman/5.5/zh- CN/insert.html
问题内容: 我目前在MySQL上使用这种类型的SQL在单个查询中插入多行值: 关于PDO的阅读,使用准备好的语句应该比静态查询为我提供更好的安全性。 因此,我想知道是否可以使用准备好的语句生成“通过使用一个查询插入多行值”。 如果是,请问我该如何实施? 问题答案: 使用PDO预准备语句插入多值 在一个execute语句中插入多个值。为什么这样,因为根据此页面,它比常规插入更快。 更多的数据值,或者
问题内容: 让我们假设我必须将一个包含许多fk的表插入到表中,只是为了在 错误的语句 下面进行解释: 因此,基本上要插入的值来自不同的子查询,是否有可能实现这种行为? 问题答案: