gpt4 book ai didi

php - 如何使用准备好的语句插入多行

转载 作者:搜寻专家 更新时间:2023-10-31 21:36:04 25 4
gpt4 key购买 nike

我使用了一个非常简单的插入语句

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。 (如有疑问,请对所有非 BLOB 的内容使用 s。)

测试/工作代码:

$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();

使用带有单行占位符的准备语句并在循环中一次一行地执行查询也没有错。


对于寻找类似动态查询技术的任何人:

关于php - 如何使用准备好的语句插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com