2014-10-09 75 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();