使用PDO准备好的语句插入多行?mysql
首先要说的是,由于只有一个查询,您可以插入多行 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