2014-10-09 117 views
3

我一直在使用PDO和下面的函数一次插入1000个块的多个记录。现在我正在使用一个使用mysqli的系统,我想知道是否可以稍微修改我的函数以使用mysqli,但是我注意到mysqli execute不接受数组作为参数。以下功能可与PDO完美结合:如何用mysqli一次插入多个记录类似于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); 
} 

谢谢!

+0

'mysqli'不支持尽可能多的方法来为PDO绑定,所以你可能有更多的麻烦事情了。 – tadman 2014-10-09 17:47:23

+0

可能有用:[15149157 /最好的方式插入许多值在mysqli](http://stackoverflow.com/questions/15149157/best-way-to-insert-many-values-in -mysqli) – 2014-10-09 19:40:38

回答

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调用的第一个参数。

然后,我们可以使用反射类做结合

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