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

时间:2014-10-09 17:44:34

标签: 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();
    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 个答案:

答案 0 :(得分:1)

你已经找到了人们对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]现在应该看起来像ssssss(与数组中的元素具有相同数量的s)。我假设这样做而不重构你的array_merge,这可能会导致问题。该字符串必须首先,因为它将成为mysqli bind_param调用的第一个参数。

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

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