Mysqli多行插入,简单的多插入查询

11

我该如何使用mysqli插入查询?...

INSERT INTO table (field1, field2, field3) VALUES ('value', 'value', 'value'), ('value', 'value', 'value'), ('value', 'value', 'value');
通常在MySQL中,这个查询很简单,会插入3行数据。如果不使用预处理语句或者使用预处理语句但不想变得太复杂,我该如何在mysqli中执行此操作?我只想知道是否有一种方法可以执行这样的查询,而不需要在PHP中添加任何额外的花哨操作。
实质上,我有一些提取出来的数据,每次插入大约有10行(还需要多次插入以及多行),这就是我需要它的原因。我只希望使用一个查询来完成此操作,就像我通常在mysql中所做的那样,而不是为每一行添加多个插入语句。

mysqli只是一组用于将查询发送到mysql的函数。 - Your Common Sense
将SQL语句存储在一个变量中,并将其作为参数传递给mysqli_query函数。 - Sajuna Fernando
Sajuna,不幸的是,不能用那种方式完成。Mysqli 不同于 mysql。 - user1675155
尝试在已经打开了mysqli连接的情况下使用mysql,但是没有成功! - user1675155
3个回答

23
mysqli类提供了多种不同的插入方法,每种方法都有其自身的优点。毫无疑问,其中一种方法应该符合您的需求。
以下示例假定您未指定的“提取数据”存储在一个数组的数组中:$bigArray [0 ... datasetsize] [0 ... 2]。
假设mysqli数据库为$db。
方法1-尽可能简单
如果您想使用准备好的语句和参数绑定,则首次尝试可能如下所示。虽然不是最佳选择,但语句仅准备一次。但是,变量会为每个插入绑定,这是浪费资源的(但简单)。由于插入未捆绑,因此示例循环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();

2
这正是我试图避免的,就像我说的那样,我只想传递查询,而不需要在PHP中执行额外的花哨操作,这是花哨操作的极端例子,换句话说,我希望尽可能原始地传递查询。 - user1675155
@fyo 但是如果数据不是存储在数组中,而是存储在JSON对象中,你将如何处理Method1或Method2?如何将数百或数千个JSON数据集切片成10个一组的块,以便一次性插入它们? - Peter
2
答案中的 $f 是什么? - snowflake

-2
$sql = "INSERT INTO `aspnetuserroles` (`UserId`, `RoleId`)
         VALUES ('1', '8811404'), ('1', '1429d')";
$stmt = mysqli_prepare($conn, $sql); 

  if (mysqli_stmt_execute($stmt)) {
       echo '<script language="javascript">';
       echo 'alert("Registeration Sucessfull!")';
       echo '</script>';
     
     } else {
             echo '<script language="javascript">';
             echo 'alert("User Role Registeration Failed!")';
             echo '</script>';
             echo $sql;
                            } 

-4

Mysqli 不是一个数据库,而只是一组将您的查询发送到旧 mysql 的函数。

因此,使用 mysqli 您可以运行任何 mysql 查询。

但是,在动态提供值的情况下,您无法避免在 PHP 中使用“额外的花哨东西”,因为您应该使用预处理语句。不幸的是,原始的 mysqli 并不那么容易应用它们。

因此,要执行这样的插入操作,您需要首先创建一个带有占位符的查询:

INSERT INTO table (field1,field2,field3) VALUES (?, ?, ?), (?, ?, ?), (?, ?, ?);

然后使用 call_user_func_array() 绑定所有值,最后 execute


好的,我想我可以做到。整个查询实际上是用php准备的,所以它将是一个长的单一查询,但我想我必须修改它以适应mysqli。本来不想为了仅仅插入而做额外的工作,但我想我必须调整到mysqli。谢谢!非常好的答案。 - user1675155
找到了一个类似的问题:https://dev59.com/XHDXa4cB1Zd3GeqP7QPG,但仍然没有解决方案!!! - user1675155

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