开发者社区> 问答> 正文

使用PDO准备好的语句插入多行?mysql

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

$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); 我要插入的值将来自数组,例如:$ values [0] ['val1']; $ values [0] ['val2']; $ values [0] ['val3']; $ values [1] ['val1']; $ values [2] ['val2'];

等等

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

展开
收起
保持可爱mmm 2020-05-17 22:36:35 34405 0
1 条回答
写回答
取消 提交回答
  • 首先要说的是,由于只有一个查询,您可以插入多行 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获得良好的解决方案(例如)。 你要记住,你想有一个完整prepare和execute过程(在安全期限,你必须单独通过每个参数)。

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

    $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查询就可以动态方式进行处理

    如果要插入的行太多(请参阅此),则应execute一个接一个

    $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); }来源:stack overflow

    2020-05-17 22:38:21
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像