php - 使用 PDO 准备语句插入多行

标签 php mysql pdo prepared-statement

我想知道是否可以使用一个准备好的语句插入多行。 下面是我通常如何将一行插入数据库的示例:

$params=array();
$params[':val1']="val1";
$params[':val2']="val2";
$params[':val3']="val3";
$sql="INSERT INTO table VALUES (col1,col2,col3) VALUES (:val1,:val2,:val3)";
$stmt=DB::getInstance()->prepare($sql);
$stmt->execute($params);

我要插入的值将来自一个数组,例如: $值[0][‘val1’]; $值[0][‘val2’]; $值[0][‘val3’]; $值[1][‘val1’]; $值[2]['val2'];

等等

这段代码可能必须一次插入几百行,我考虑过创建一个循环来创建数百个参数,然后在 sql 语句后附加每行一个额外的插入,但我认为必须有更好的方法。执行此操作的最佳方法是什么?

最佳答案

首先要说的是,您可以插入多行,这要归功于一个 INSERT查询

INSERT INTO Table (col1, col2, col3) 
VALUES ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi'),
       ('abc', 'def', 'ghi')
       -- and so on...

一旦了解了这一点,您就可以使用 PDO(例如)获得良好的解决方案。
您必须记住,您需要一个完整的 prepareexecute 过程(在安全性方面,您必须分别传递每个参数)。

假设您要插入的行结构如下:

$rows = array(
              array('abc', 'def', 'ghi'), // row 1 to insert
              array('abc', 'def', 'ghi'), // row 2 to insert
              array('abc', 'def', 'ghi')  // row 3 to insert
              // and so on ...
);

您的目标是将此结果作为准备好的查询:

INSERT INTO Table (col1, col2, col3) 
VALUES (?, ?, ?),
       (?, ?, ?),
       (?, ?, ?)

与其对应的执行:

PDOStatement::execute(array('abc', 'def', 'ghi', 'abc', 'def', 'ghi', 'abc', 'def', 'ghi'));


好吧,您只有现在必须这样做:

$rows = array(
              array('abc', 'def', 'ghi'),
              array('abc', 'def', 'ghi'),
              array('abc', 'def', 'ghi')
);

$row_length = count($rows[0]);
$nb_rows = count($rows);
$length = $nb_rows * $row_length;

/* Fill in chunks with '?' and separate them by group of $row_length */
$args = implode(',', array_map(
                                function($el) { return '('.implode(',', $el).')'; },
                                array_chunk(array_fill(0, $length, '?'), $row_length)
                            ));

$params = array();
foreach($rows as $row)
{
   foreach($row as $value)
   {
      $params[] = $value;
   }
}

$query = "INSERT INTO Table (col1, col2, col3) VALUES ".$args;
$stmt = DB::getInstance()->prepare($query);
$stmt->execute($params);

然后……就是这样!

这样,每个参数都被单独处理,这就是您想要的(安全性、安全性、安全性!)以及所有这些,以动态方式,只有一个 INSERT 查询


如果要插入的行太多(参见 this),则应逐一执行

$rows = array(
              array('abc', 'def', 'ghi'), // row 1 to insert
              array('abc', 'def', 'ghi'), // row 2 to insert
              array('abc', 'def', 'ghi')  // row 3 to insert
              // and so on ...
);

$args = array_fill(0, count($rows[0]), '?');

$query = "INSERT INTO Table (col1, col2, col3) VALUES (".implode(',', $args).")";
$stmt = $pdo->prepare($query);

foreach ($rows as $row) 
{
   $stmt->execute($row);
}

关于php - 使用 PDO 准备语句插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19680494/

相关文章:

php - Laravel Eloquent : after() not adding column after a certain column

php - 在 php 中从空格切换到制表符分隔

php - 日期之间的MySQL日期

php - 从数据库中检索记录并将这些记录与当前值进行比较

php - PDO 阵列插入

php - pdo fetchAll 函数返回一个空数组

php - 无法在mysql中进行连接查询或我的表结构错误

python - 树莓派MYSQL数据库异常

php - SQL 查询在 PHP 中返回 null,但在 MySQL 中返回正确结果

php - 显示 INNER JOIN 的结果