2014-07-17 82 views
0

我試圖導入一個相對較大的csv文件到我的數據庫(7500 +行,43列),我遇到了一些奇怪的錯誤。fgetcsv與MySQL:奇怪的錯誤

$file = fopen(APPLICATION_PATH."/../docs/data.csv", "r"); 

    while (($emapData = fgetcsv($file, 100000, ";")) !== FALSE) 
    { 


     $dataTable->addline($emapData[0] , .. , emapdata[42]); 

    } 
    fclose($file); 

當我這樣做時,我的文件被加載兩次到我的數據庫(15k +行)。

但是,如果我從主鍵中刪除自動遞增禮,我手動添加它(我也改變我addLine法):

$file = fopen(APPLICATION_PATH."/../docs/data.csv", "r"); 
    $id=0; 
    while (($emapData = fgetcsv($file, 100000, ";")) !== FALSE) 
    { 

     $dataTable->addline($id,$emapData[0] , .. , emapdata[42]); 
     $id++; 
    } 
    fclose($file); 

有時工作有時它拋出一個完整性錯誤(主關鍵已存在)。

在這兩種情況下,我真的不明白髮生了什麼事。

編輯:

我addLines方法(相當長的對不起):

第一種情況

public function addLine($idtopo, $oms, $voie_oms, $och_otu, $etat_och_otu, $fameqpta_och_otu, $fameqptb_och_otu, $voie_och_otu, $odu4, $etat_odu4, $fameqpta_odu4, $fameqptb_odu4, $voie_odu4, $odu3, $etat_odu3, $fameqpta_odu3, $fameqptb_odu3, $voie_odu3, $odu2, $etat_odu2, $fameqpta_odu2, $fameqptb_odu2, $voie_odu2, $odu1, $etat_odu1, $fameqpta_odu1, $fameqptb_odu1, $voie_odu1, $cat_supporte, $supporte, $etat_supporte, $produit, $utilisation, $com1_och_otn, $com2_och_otn, $com1_odu2, $com2_odu2, $com1_odu1, $com2_odu1, $com1_supporte, $com2_supporte, $srlg){ 

    $db= Zend_Db_Table::getDefaultAdapter(); 

    $sql="INSERT INTO `data` (`idtopo`, `oms`, `voie_oms`, `och_otu`, `etat_och_otu`, `fameqpta_och_otu`, `fameqptb_och_otu`, `voie_och_otu`, `odu4`, `etat_odu4`, `fameqpta_odu4`, `fameqptb_odu4`, `voie_odu4`, `odu3`, `etat_odu3`, `fameqpta_odu3`, `fameqptb_odu3`, `voie_odu3`, `odu2`, `etat_odu2`, `fameqpta_odu2`, `fameqptb_odu2`, `voie_odu2`, `odu1`, `etat_odu1`, `fameqpta_odu1`, `fameqptb_odu1`, `voie_odu1`, `cat_supporte`, `supporte`, `etat_supporte`, `produit`, `utilisation`, `com1_och_otn`, `com2_och_otn`, `com1_odu2`, `com2_odu2`, `com1_odu1`, `com2_odu1`, `com1_supporte`, `com2_supporte`, `srlg`) values (   
                  '".$idtopo."', 
                  '".$oms."', 
                  '".$voie_oms."', 
                  '".$och_otu."', 
                  '".$etat_och_otu."', 
                  '".$fameqpta_och_otu."', 
                  '".$fameqptb_och_otu."', 
                  '".$voie_och_otu."', 
                  '".$odu4."', 
                  '".$etat_odu4."', 
                  '".$fameqpta_odu4."', 
                  '".$fameqptb_odu4."', 
                  '".$voie_odu4."', 
                  '".$odu3."', 
                  '".$etat_odu3."', 
                  '".$fameqpta_odu3."', 
                  '".$fameqptb_odu3."', 
                  '".$voie_odu3."', 
                  '".$odu2."', 
                  '".$etat_odu2."', 
                  '".$fameqpta_odu2."', 
                  '".$fameqptb_odu2."', 
                  '".$voie_odu2."', 
                  '".$odu1."', 
                  '".$etat_odu1."', 
                  '".$fameqpta_odu1."', 
                  '".$fameqptb_odu1."', 
                  '".$voie_odu1."', 
                  '".$cat_supporte."', 
                  '".$supporte."', 
                  '".$etat_supporte."', 
                  '".$produit."', 
                  '".$utilisation."', 
                  '".$com1_och_otn."', 
                  '".$com2_och_otn."', 
                  '".$com1_odu2."', 
                  '".$com2_odu2."', 
                  '".$com1_odu1."', 
                  '".$com2_odu1."', 
                  '".$com1_supporte."', 
                  '".$com2_supporte."', 
                  '".$srlg."' 
                 )"; 


    $db->exec($sql); 
    $db->closeConnection(); 


} 

第二種情況

public function addLine($id,$idtopo, $oms, $voie_oms, $och_otu, $etat_och_otu, $fameqpta_och_otu, $fameqptb_och_otu, $voie_och_otu, $odu4, $etat_odu4, $fameqpta_odu4, $fameqptb_odu4, $voie_odu4, $odu3, $etat_odu3, $fameqpta_odu3, $fameqptb_odu3, $voie_odu3, $odu2, $etat_odu2, $fameqpta_odu2, $fameqptb_odu2, $voie_odu2, $odu1, $etat_odu1, $fameqpta_odu1, $fameqptb_odu1, $voie_odu1, $cat_supporte, $supporte, $etat_supporte, $produit, $utilisation, $com1_och_otn, $com2_och_otn, $com1_odu2, $com2_odu2, $com1_odu1, $com2_odu1, $com1_supporte, $com2_supporte, $srlg){ 

    $db= Zend_Db_Table::getDefaultAdapter(); 

    $sql="INSERT INTO `data` (`id`, `idtopo`, `oms`, `voie_oms`, `och_otu`, `etat_och_otu`, `fameqpta_och_otu`, `fameqptb_och_otu`, `voie_och_otu`, `odu4`, `etat_odu4`, `fameqpta_odu4`, `fameqptb_odu4`, `voie_odu4`, `odu3`, `etat_odu3`, `fameqpta_odu3`, `fameqptb_odu3`, `voie_odu3`, `odu2`, `etat_odu2`, `fameqpta_odu2`, `fameqptb_odu2`, `voie_odu2`, `odu1`, `etat_odu1`, `fameqpta_odu1`, `fameqptb_odu1`, `voie_odu1`, `cat_supporte`, `supporte`, `etat_supporte`, `produit`, `utilisation`, `com1_och_otn`, `com2_och_otn`, `com1_odu2`, `com2_odu2`, `com1_odu1`, `com2_odu1`, `com1_supporte`, `com2_supporte`, `srlg`) values (   ".$id.", 
                  '".$idtopo."', 
                  '".$oms."', 
                  '".$voie_oms."', 
                  '".$och_otu."', 
                  '".$etat_och_otu."', 
                  '".$fameqpta_och_otu."', 
                  '".$fameqptb_och_otu."', 
                  '".$voie_och_otu."', 
                  '".$odu4."', 
                  '".$etat_odu4."', 
                  '".$fameqpta_odu4."', 
                  '".$fameqptb_odu4."', 
                  '".$voie_odu4."', 
                  '".$odu3."', 
                  '".$etat_odu3."', 
                  '".$fameqpta_odu3."', 
                  '".$fameqptb_odu3."', 
                  '".$voie_odu3."', 
                  '".$odu2."', 
                  '".$etat_odu2."', 
                  '".$fameqpta_odu2."', 
                  '".$fameqptb_odu2."', 
                  '".$voie_odu2."', 
                  '".$odu1."', 
                  '".$etat_odu1."', 
                  '".$fameqpta_odu1."', 
                  '".$fameqptb_odu1."', 
                  '".$voie_odu1."', 
                  '".$cat_supporte."', 
                  '".$supporte."', 
                  '".$etat_supporte."', 
                  '".$produit."', 
                  '".$utilisation."', 
                  '".$com1_och_otn."', 
                  '".$com2_och_otn."', 
                  '".$com1_odu2."', 
                  '".$com2_odu2."', 
                  '".$com1_odu1."', 
                  '".$com2_odu1."', 
                  '".$com1_supporte."', 
                  '".$com2_supporte."', 
                  '".$srlg."' 
                 )"; 


    $db->exec($sql); 
    $db->closeConnection(); 


} 

基本上我只是添加了ID參數和我禁用我的表中的自動遞增選項

+0

看來錯誤是在你的addLine方法。所以你應該讓我們看看這兩種形式的方法。 – VMai

+0

你的主鍵是什麼?它只包含id或其他字段呢? – peppelauro

+0

@peppelauro只有編號 – slayne

回答

0

你可以嘗試使用,而不是在addLine功能使用EXEC插入方法:

$data = array(
'idtopo' => $idtopo 
, 'oms' => $oms 
, 'voie_oms' => $voie_oms 
... 
); 

$db->insert('data', $data); 
+0

我不明白爲什麼,但它像一個魅力。非常感謝你 ! – slayne