我想知道是否可以使用一条准备好的语句插入多行。以下是我通常如何在数据库中插入一行的示例:
$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语句后每行附加一个额外的插入,但是我认为必须有更好的方法。最好的方法是什么?
首先要说的是,由于只有一个查询,您可以插入多行 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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。