如何使用 mysqli 插入此查询?...
INSERT INTO table (field1, field2, field3) VALUES ('value', 'value', 'value'), ('value', 'value', 'value'), ('value', 'value', 'value');
通常在 mysql 中这个查询是直接的并且会插入 3 行,我如何在 mysqli 中执行此操作而不使用准备好的语句或可能使用准备好的语句但又不会变得太复杂?我只是想知道是否有一种方法可以执行此类查询,而无需在 PHP 中执行额外的时髦操作。
本质上,我有一些提取的数据,每次插入大约有 10 行(并且除了多行之外还需要多次插入),这就是我需要它的目的。我只希望通过查询执行此操作,就像我通常使用 mysql 执行的那样,而不是为每一行添加多个插入。
最佳答案
mysqli 类提供了许多不同的方法来完成插入,每种方法都有自己的优点。当然,其中之一应该可以满足您的需求。
以下示例假设您未指定的“提取的数据”存储在数组数组中:$bigArray[0...datasetsize][0...2]。
假设 mysqli 数据库为 $db。
方法 1 - 尽可能简单
如果您想使用准备好的语句和参数绑定(bind),第一个努力可能如下所示。虽然不是最佳的,但该语句只准备一次。然而,变量是为每个插入绑定(bind)的,这是浪费的(但简单)。由于插入未捆绑,因此该示例循环超过 10 个。
$statement = $db->prepare("INSERT INTO testTable (fieldA, fieldB, fieldC) VALUES (?,?,?)");
for ($i = 0; $i < 10; ++$i)
{
$statement->bind_param("iii",$bigArray[$i][0],$bigArray[$i][1],$bigArray[$i][2]);
$statement->execute();
}
方法 2 - 优化
准备好的语句和多个插入相结合可实现与方法 1 的原始插入查询几乎相同的性能。实际结果将根据您的设置而有所不同,但在我的系统上使用本地和远程数据库进行的快速测试显示了性能使用优化方法更快几个百分点,如果方法 1 中的数据需要转义,则可以再增加几个百分点。
下面使用call_user_func_array,但是如果您知道每次要捆绑多少个插入并直接构建调用bind_param,则可以避免这种情况。这将进一步略微提高性能。
$sql = "INSERT INTO testTable (fieldA,fieldB,fieldC) VALUES (?,?,?)".str_repeat(",(?,?,?)",count($bigArray)-1);
$statement = $db->prepare($sql);
// This is the type string used by statement::bind_param.
// s will be good for any type.
$types = str_repeat("s", count($bigArray) * count($bigArray[0]));
$values = array_merge(...$bigArray);
$statement->bind_param($types, ...$values);
$statement->execute();
关于php - Mysqli多行插入,简单的多插入查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49426587/