如何使用预处理语句插入多行数据

4
我使用非常简单的插入语句。
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();
    }
}
编辑#2:我的值来自于一个长度可变的多维数组。
$values = array( array(1,2,3), array(4,5,6), array(7,8,9), ... );

使用多值子句的插入查询只是普通的查询,就像其他任何查询一样。这意味着您只需要准备并运行它即可。 - Your Common Sense
你是如何获取值(1,2,3),(4,5,6),(7,8,9)的?这是通过任何循环获取的吗? - Shafeeque
我想插入多个值集,例如(1,2,3),(4,5,6),(7,8,9)等等。这些值来自一个长度可变的多维数组。 - eevaa
你能使用预处理语句运行这样的查询吗:INSERT INTO table (col1, col2, col3, col4) VALUES (1,2,3,4) - Your Common Sense
1
这就是预处理语句的正确使用方式:你先准备好语句(包括解析和其他复杂操作),然后逐行循环发送值。 - user3277192
显示剩余3条评论
1个回答

4

通常只有在为包含 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();

使用带有单个占位符行的预处理语句,并在循环中一次执行一个查询也没有问题。


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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接