使用PDO准备好的语句插入多行?mysql-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

2020-05-17 22:36:35 5263 1

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

$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语句后每行附加一个额外的插入,但是我认为必须有更好的方法。最好的方法是什么?

取消 提交回答
全部回答(1)
  • 保持可爱mmm
    2020-05-17 22:38:21

    首先要说的是,由于只有一个查询,您可以插入多行 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

    0 0
相关问答

1

回答

【RDS】RDS MySQL如何终止会话?

2022-01-12 16:17:02 472浏览量 回答数 1

1

回答

RDS MySQL如何终止会话?

2022-01-07 14:15:23 892浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL中目标库信息的说明是什么?

2021-12-14 15:27:07 92浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL中数据库账号的权限要求是什么?

2021-12-14 15:26:04 221浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL支持增量迁移的SQL操作是什么?

2021-12-14 15:25:20 168浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL的迁移类型说明是什么?

2021-12-14 15:24:34 98浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL的费用说明是什么?

2021-12-14 15:24:04 80浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL中特殊情况的说明是什么?

2021-12-14 15:23:28 106浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL中其他限制的说明是什么?

2021-12-14 15:23:09 71浏览量 回答数 1

1

回答

自建MySQL迁移至RDS MySQL中源库限制的说明是什么?

2021-12-14 15:22:47 104浏览量 回答数 1
66
文章
12595
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载