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

Php 如何使用类似于pdo的mysqli一次插入多个记录,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,我一直在使用PDO和下面的函数一次插入1000个记录块中的多个记录。现在我使用的是一个使用mysqli的系统,我想知道是否可以稍微修改一下我的函数来使用mysqli,但是我注意到mysqli execute不接受数组作为参数。使用PDO时,以下功能可以完美快速地工作: $sub_data = array_chunk($data, 1000); for ($b = 0; $b < count($sub_data); $b++) { $insert_values = array();

我一直在使用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);
}
$sub_data=array_chunk($data,1000);
对于($b=0;$bprepare($sql2);
尝试
{
$prepare->execute($insert_值);
}
catch(mysqli\u sql\u异常$e)
{
回声“;
打印($sub_数据[$b]);
回声“;
echo$e->getMessage();
打印($db->errorInfo());
}
未设置($insert_值);
未设置($占位符);
}

谢谢大家!

您发现了人们对mysqli扩展的最大不满之一。PDO使用令牌绑定系统,您可以在其中传递一组参数和密钥,PDO将它们结合起来。Mysqli使用了一个更模糊的绑定系统,当需要传递给数组的元素数量不确定时,该系统可能会导致问题

一个主要问题是mysqli想知道第一个参数应该是什么类型的数据。如果你不关心这个级别的过滤,你可能只需要将所有东西声明为字符串就可以了。如果这不起作用,请添加一些逻辑以在字符串和整数之间进行更改。为此,我们将在开头向
$insert_values
添加另一个参数,以便将适当数量的字符串作为第一个参数传入

$reflect = new ReflectionClass('mysqli_stmt');
$method = $reflect->getMethod('bind_param');
$method->invokeArgs($prepare, $insert_values);
$prepare->execute();  

mysqli
不支持与PDO一样多的绑定方法,因此您在执行此操作时可能会遇到更多问题。可能有用:
$reflect = new ReflectionClass('mysqli_stmt');
$method = $reflect->getMethod('bind_param');
$method->invokeArgs($prepare, $insert_values);
$prepare->execute();