我使用一个非常简单的插入语句
INSERT INTO table (col1, col2, col3) VALUES (1,2,3), (4,5,6), (7,8,9), ...
目前,保存要插入的值的查询部分是在循环中构造的单独字符串。
如何使用预准备语句插入多行?
编辑:我找到了这段代码。但是,这会对每一行执行单独的查询。这不是我要找的。
$stmt = $mysqli->stmt_init();
if ($stmt->prepare("INSERT INTO table (col1, col2, col3) VALUES (?,?,?)")){
$stmt->bind_param('iii', $_val1, $_val2, $_val3);
foreach( $insertedata as $data ){
$_val1 = $data['val1'];
$_val2 = $data['val2'];
$_val3 = $data['val3'];
$stmt->execute();
}
}
edit#2:我的值来自可变长度的多维数组。
$values = array( array(1,2,3), array(4,5,6), array(7,8,9), ... );
这
通常只是我在为包含IN
子句的查询编写预准备语句时使用的一种技术。 无论如何,我已经对其进行了调整以形成单个准备查询(而不是迭代的准备查询(,并且我测试了它在我的服务器上是否成功。 这个过程有点复杂,我不知道速度是否会有任何优势(没有基准测试(。这真的不是开发人员在生产中烦恼的事情。
在以下代码片段中,每行要插入的列数是已知的。 出于这个原因,有一个"魔术"3
和一个硬编码?,?,?
。
...array_merge(...$rows)
用于平展然后解压缩值的有效负载。
对于正在处理字符串类型值的研究人员,只需将i
更改为 s
。 (如有疑问,请将 s
用于非 BLOB 的所有内容。
测试/工作代码:
$rows = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]; // sample indexed array of indexed arrays
$rowCount = count($rows);
$values = "(" . implode('),(', array_fill(0, $rowCount, '?,?,?')) . ")";
$conn = new mysqli("localhost", "root", "", "myDB");
$stmt = $conn->prepare("INSERT INTO test (col1, col2, col3) VALUES $values");
$stmt->bind_param(str_repeat('i', $rowCount * 3), ...array_merge(...$rows));
$stmt->execute();
<小时 />使用带有单行占位符的预准备语句并在循环中一次执行一行查询也没有错。
<小时 />对于寻找类似动态查询技术的任何人:
-
SELECT
IN()
中值的动态数量 - 具有动态
LIKE
条件数的SELECT