2015-11-17 39 views
0

我正在使用LOAD DATA INFILE替換一個短腳本,以便使用PHP將CSV快速插入到MySQL數據庫中。在構建MySql中使用PHP變量變量INSERT

我完全難住,並希望得到一些幫助 - 我一直在看這個小時,只是困惑自己!

問題是我不知道CSV中的列數,也不想定義它們,因爲它們可能會發生變化。

從CSV獲得標題:

// Get the first column of the file to create the column headers 
$fp = fopen($upload_folder . $tempName . '.csv', 'r'); 
$frow = fgetcsv($fp, 100000, ','); 

// Set import strings 
$columns = ''; 
$data_string = ''; 

$col_count = 0; 

foreach($frow as $column) { 
    // Build import strings 
    $columns .= "`$column` varchar(50)"; 
    $data_string .= "'$" . "data[" . $col_count . "]', "; 

    // Now increment the column count 
    $col_count++; 
} 

進口:(我已經回顯的這個,因爲我不希望它運行!)

while (($data = fgetcsv($fp, 100000, ",")) !== FALSE) { 
     echo "INSERT INTO nav_data_" . $tempName . " (" . $columns . ") VALUES (" . $data_string . ") "; 
    } 

問題: 雖然列名在WHILE語句中調用的第二個$ data [0],$ data [1]沒有被解析,所以我得到:

VALUES ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]', '$data[5]', '$data[6]' ... '$data[25]') 

在哪裏,因爲我想從$數據= fgetcsv($ fp的,100000,「」)的輸出...

VALUES ('1', 'Farming', 'Tree', 'Tractor', '345', 'etc.') 

我知道這是用PHP變量變量,但對我來說我的生活中做不能解決這個問題。

例CSV數據導入:(根據要求)

Document Type No_ Order Date Shipment Date Sell-to Customer No_ Sell-to Customer Name Bill-to Customer No_ Bill-to Name Ship-to Code Order Status Customer Disc_ Group Salesperson Code Entered by Taken at External Document No_ Taken By Sample Payment Method Code Currency Code Payment Terms Code Amount O/S Amount Ex VAT (LCY) No_ Order Lines No_ Complete Order Lines Delivery Date 


    Order SO006906 02/12/14 15/04/15 C001293 Amazon C001293 Amazon DEL Insufficient Credit  HS SARAH EMAIL   0 ACCOUNT  30D 2313 2313 15 11 


    Order SO007198 13/01/15 01/04/15 C000871 Amazon C000871 Amazon DEL Awaiting Order Ack.  SUSP SARAH FF15 RESERVE SUSP 0 ACCOUNT  30DS2.5/30 688 688 4 0 


    Order SO008292 01/05/15 19/10/15 C003075 Amazon C003075 Amazon DEL Proforma Ready To Ship  ZP SARAH REP   0 PROFORMA  PROFORMA 484.8 484.8 21 0 
+0

你可以從csv文件發佈一些你的數據,幾行嗎? – mandza

+0

我已經將一些數據添加到原始帖子mandza - 它太長的評論 - 感謝您看這個! – Giles

回答

2

我覺得你的問題是圍繞$data_string .= "'$" . "data[" . $col_count . "]', ";。我可以建議創建一個$column數組,並在循環後對它進行內插以防止逗號結束。

$column = array(); 
foreach($frow as $column) { 

    // Build import strings 
    $column[] = "`$column` varchar(50)"; 

    // Now increment the column count 
    $col_count++; 
} 
$columns = implode(',',$column); 

然後,在與上述相同的方式使用$data$col_count產生while循環您的插入值的字符串。

while (($data = fgetcsv($fp, 100000, ",")) !== FALSE) { 

    //$insertColumn = array(); 
    //for($i=0;$i<=$col_count;$i++){ 
    //  $insertColumn[] = $data[$i]; 
    //} 
    //$insertColumnString = implode("','",$insertColumn); 
    $insertColumnString = implode("','",$data); 

    echo "INSERT INTO nav_data_{$tempName} ($columns) VALUES ('$insertColumnString')"; 

} 
+0

或者只是添加'rtrim($ data_string,「,」);'儘管你提供的解決方案是最好的... ... –

+0

fgetcsv返回一個數組,所以你可以直接內爆它。 – captainroxors

+0

@captainroxors當然是的。答案已更新。謝謝! – MaggsWeb