我使用一个非常简单的插入语句
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), ... );
最佳答案
这通常只是我在为包含IN
子句的查询编写准备好的语句时使用的一种技术。不管怎样,我已经修改了它来形成一个单独的准备好的查询(而不是迭代的准备好的查询),并且我在我的服务器上测试了它是否成功。这个过程有点复杂,我不知道在速度上是否会有任何优势(没有基准测试)。这真的不是开发人员在生产中要操心的事情。
代码:
if (!$mysqli = new mysqli($config[0], $config[1], $config[2], $config[3])) {
echo "connection bonk";
} else {
$array = [[1, 2, 3],[4, 5, 6], [7, 8, 9]]; // sample indexed array of indexed arrays
$params = [];
foreach ($array as $row) {
$parentheticals[] = '('.implode(',', array_fill(0, sizeof($row), '?')).')'; // build parentheticals
$params = array_merge($params, $row); // flatten actual values to 1-dim array
}
$values = implode(',', $parentheticals);
$count = sizeof($params); // assuming you have balanced subarrays
if ($stmt = $mysqli->prepare("INSERT INTO test (col1, col2, col3) VALUES $values")) {
array_unshift($params, str_repeat('i', $count)); // prepend the type values string
$ref = []; // add references
foreach ($params as $i=>$v) {
$ref[$i] = &$params[$i]; // pass by reference as required/advised by the manual
}
call_user_func_array([$stmt, 'bind_param'], $ref);
if ($stmt->execute()) {
echo $stmt->affected_rows , " affected rows"; // how many rows were inserted
} else {
echo "execution bonk";
}
$stmt->close();
} else {
echo "prepare bonk";
}
}
关于php - 如何使用准备好的语句插入多行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19271169/