php - PDO MySQL : Insert multiple rows in one query

标签 php mysql pdo

你好,我正在制作一个用于在 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

问题是我在 $insert->execute($data); 上仍然收到错误 Array to string conversion 我该如何解决?

这是我正在制作的片段。

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

关于php - PDO MySQL : Insert multiple rows in one query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10060721/

相关文章:

mysql - 如何改进我的好友列表MySQL查询?

MySQL 单列 n-gram 拆分和计数

php - 更新 Select 查询循环所基于的字段

php - Apache、PHP、MySQL、PDO、权限被拒绝、laravel

php - Parse.com php 异常显示所有错误

php - Cakephp 3.x - 国际化整页

javascript - 提交页面时使用ajax保留选中的复选框

php - 在一个 inc_ 文件中使用 session 的用户登录状态

php - 无法在postgresql pdo中插入和读取数据

php - php中的静态变量和全局变量有什么区别?