当前位置: 首页 > 知识库问答 >
问题:

如何使用类似pdo的mysqli一次插入多条记录

朱雅惠
2023-03-14

我一直在使用PDO和下面的函数一次在1000个块中插入多个记录。现在,我正在使用一个使用mysqli的系统,我想知道是否可以稍微修改一下我的函数,使其也能使用mysqli。但是,我注意到mysqli execute不接受数组作为参数。以下函数与PDO配合使用非常好且快速:

$sub_data = array_chunk($data, 1000);
for ($b = 0; $b < count($sub_data); $b++)
{
    $insert_values = array();
    for ($a = 0; $a < count($sub_data[$b]); $a++)
    {
        $insert_values = array_merge($insert_values, array_values($sub_data[$b][$a]));
        $placeholder[] = '(' . implode(', ', array_fill(0, count($sub_data[$b][$a]), '?')) . ')';
    }

    $sql2    = "INSERT INTO $table_name (" . implode(",", array_keys($sub_data[$b][0])) . ") VALUES " . implode(',', $placeholder) . "";
    $prepare = $db->prepare($sql2);
    try
    {
        $prepare->execute($insert_values);
    }
    catch (mysqli_sql_exception $e)
    {
        echo "<pre>";
        print_r($sub_data[$b]);
        echo "</pre>";
        echo $e->getMessage();
        print_r($db->errorInfo());
    }
    unset($insert_values);
    unset($placeholder);
}

谢谢!

共有1个答案

益英逸
2023-03-14

您发现了人们对mysqli扩展的一个更大的抱怨。PDO使用令牌绑定系统,您可以在其中传递参数和键的数组,PDO将它们结合在一起。Mysqli使用了一个更加模糊的绑定系统,当要传递给数组的元素数量不确定时,这可能会引起问题。

一个主要的问题是,mysqli想要知道期望什么类型的数据作为第一个参数。如果您不关心过滤的级别,那么您可能只需将所有内容声明为字符串即可。如果那不起作用,添加一些逻辑来在字符串和整数之间进行更改。为此,我们将在开始时向$insert_values添加另一个参数,以便将适当数量的字符串作为第一个参数传入

$insert_values = array(0 => '');
for ($a = 0; $a < count($sub_data[$b]); $a++)
{
    $insert_values = array_merge($insert_values, array_values($sub_data[$b][$a]));
    $placeholder[] = '(' . implode(', ', array_fill(0, count($sub_data[$b][$a]), '?')) . ')';
    $insert_values[0] .= 's';
}

$insert_values[0]现在应该类似于sssss(与数组中的元素具有相同数量的s)。我假设在不重构array_merge的情况下执行此操作,这可能会导致问题。该字符串必须是第一个,因为它将成为mysqlibind_param调用的第一个参数。

然后,我们可以使用Reflection类进行绑定

$reflect = new ReflectionClass('mysqli_stmt');
$method = $reflect->getMethod('bind_param');
$method->invokeArgs($prepare, $insert_values);
$prepare->execute();  
 类似资料:
  • 我将一行一行地插入数据,但我在某处听说,如果有许多数据要插入,则需要很多时间。那么,如何一次将它们全部插入?

  • 下面是准备好的语句代码的片段: 它完成工作,但只有在数百次插入之后。是否有方法将列表或数组绑定到bind_param()参数,只需运行$stmtability->execute one time或其他可以提高性能的方法。 抱歉,如果这是问和回答之前。我四处看了一会儿,发现了一些类似的问题,但没有什么能明确地回答我的要求。

  • 如本文所示,此功能在MySQL中可用,根据Sybase文档,它也应该得到支持,但是Sybase没有提供工作示例,因此您必须解释以下内容: 语法1使用指定的表达式列值插入单行或多行。如果指定,多行由附加括号分隔 因此,我将“附加括号”解释为期望下面的代码能够工作 然而,它错误地 我使用的是Sybase ASE 15,在INSERT语句的支持页面上看不到任何关于插入多行的引用 这个功能在赛贝斯可用吗?

  • 问题内容: 我正在使用此代码,而我感到无奈: 它们全部失败并抛出此错误: 致命错误 :无法在/ opt / …中通过引用传递参数2 问题答案: 我只是在学习PDO,但我认为您需要使用,而不是 接受要引用的变量,并且在调用时不提取值。我在对php文档的评论中发现了这一点: 编辑:PS您可能会想这样做,但是它并不适合所有人(感谢您将Shaver进行举报。)

  • 问题内容: 我有一个清单清单,例如。 我有一个叫做的表格和两个字段,。字段列表中的第一项映射到,第二项映射到。 如何在单个命令或调用中为每个内部列表插入行,而不是像这样使用for循环? 问题答案: 从《MySQLdb用户指南》中: 所以在你的情况下:

  • 问题内容: 我知道一次插入多个数据效率更高: 在golang中该怎么做? 使用字符串拼接,但这不是很好。db.Prepare更安全吧? 我需要一个功能更安全,更高效的函数,一次插入多个数据。 问题答案: 为什么不这样呢?(在此处编写但未进行测试,因此可能存在语法错误):