2014-02-16 82 views
3

我正試圖在CSV文件中導入60,000或更多行。該代碼只能導入5000行。有人可以幫助我嗎?使用php在MySQL中導入大型CSV文件

require_once('connection.php'); 

if ($_FILES[csv][size] > 0) { 

    //get the csv file 
    $file = $_FILES[csv][tmp_name]; 
    $handle = fopen($file,"r"); 

    //loop through the csv file and insert into database 
    do { 
     if ($data[0]) { 
      mysql_query("INSERT INTO transactions (EntryId_Pk, AccessCode, MobileNumber, TelcoCode, TIN, ORNo, ORAmt, NumOfEntries, ECN, AddedOn) VALUES 
       (
        '".addslashes($data[0])."', 
        '".addslashes($data[1])."', 
        '".addslashes($data[2])."', 
        '".addslashes($data[3])."', 
        '".addslashes($data[4])."', 
        '".addslashes($data[5])."', 
        '".addslashes($data[6])."', 
        '".addslashes($data[7])."', 
        '".addslashes($data[8])."', 
        '".addslashes($data[9])."' 
       ) 
      "); 
     } 
    } while ($data = fgetcsv($handle,1000,",","'")); 
+2

您的整篇文章不包含關於編程問題的單個問題。你怎麼了? – idmean

+0

不會''while'循環沒有比'do while更好嗎? ;) – hek2mgl

+0

@ hek2mgl同意,除非總是保證第一行。另外,我將給出關於mysql_ *被棄用的通常情況,不應該使用。每次你使用這個庫,Rasmus Lerdorf都會吃一隻小貓。 – Zarathuztra

回答

4

您可能想要使用LOAD DATA MySQL語句。這可能非常快,因爲您不需要閱讀所有內容到PHP-land中,並讓MySQL在分配上更加聰明。你可以使用PHP這樣的東西:

// dont use mysql_* anymore in new code 
mysqli_query($dblink, ' 
    LOAD DATA LOCAL INFILE "'.$file.'" 
     INTO TABLE transactions 
     FIELDS TERMINATED by "," 
     OPTIONALLY ENCLOSED BY "\'" 
     LINES TERMINATED BY "\n" 
'); 
+0

這是首選解決方案+1但是,在共享主機環境中,這可能不會被允許 – hek2mgl

+0

我應該把它放在哪裏?謝謝你所有的答案。:) – dardar

+0

這將取代代碼中的'do {...} while循環。在'INFILE'之後,你仍然需要把csv文件的路徑本身作爲參數。 – complex857

0

它可能是一個超時錯誤。嘗試設置

set_time_limit(0); 

也可以先導入以塊的數據和查詢的,而不是做一行一行內插入多行一個很好的做法。