2014-01-24 190 views
0

我一直在嘗試將一個csv文件上傳到我的數據庫中1個星期,我已經閱讀了很多教程,並且不知道我在做什麼錯誤,這是我的簡單代碼太愚蠢無法正確。任何幫助將是黃金! :)使用PHP/MySQL上傳CSV上傳

if(isset($_FILES['file'])){ 

    $csv_file = $_FILES['file']['name']; 

    $sql = <<<eof 
    LOAD DATA INFILE '$csv_file' 
    INTO TABLE test_csv 
    FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"' 
    LINES TERMINATED BY '\n' 
    (name,house,po) 
eof; 



    $result = $dbh->query($sql); 



} 

echo $csv_file .' has successfully been loaded'; 

?> 
<!DOCTYPE html> 
<html> 
<head> 
    <title>CSV to MySQL Via PHP</title> 
</head> 
<body> 
    <form enctype="multipart/form-data" method="POST"> 
    <input name="file" type="file"> 
    <input type="submit" value="Upload"> 
    </form> 
</body> 
</html> 
+0

您是否嘗試過通過SQL控制檯而不是通過PHP運行相同的查詢?然後,您可以確定它是否是您的代碼或查詢的問題。 –

+0

你的csv結構是什麼樣子的?你的db表是什麼樣的? – Latheesan

+0

@詹姆斯貝克剛告訴我拒絕訪問。這是我的blummin閱讀寫用戶訪問導致我問題呢? – Brobina

回答

2

當我不得不將CSV導入數據庫表,我總是寫我自己的csv分析器/導入器。這很簡單。

下面是一個例子。

test.csv

Firstname,Lastname,Age 
"Latheesan","Kanes",26 
"Adam","Smith",30 

test.php的

<?php 

// Mini Config 
$csv_file  = 'test.csv'; 
$delimiter  = ','; 
$enclosure  = '"'; 
$skip_first_row = true; 
$import_chunk = 250; 

// Parse CSV & Build Import Query 
$import_queries = array(); 
$first_row_skipped = false; 
if (($handle = fopen($csv_file, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, $delimiter,)) !== FALSE) { 
     if ($skip_first_row && !$first_row_skipped) { 
      $first_row_skipped = true; 
      continue; 
     } 
     list($firstname, $lastname, $age) = $data; 
     $import_queries[] = "INSERT INTO myTable (firstname, lastname, age) VALUES ('$firstname', '$lastname', $age);"; 
    } 
    fclose($handle); 
} 

// Proceed if any data got parsed 
if (sizeof($import_queries)) 
{ 
    foreach(array_chunk($import_queries, $import_chunk) as $queries) 
    { 
     $dbh->query(implode(' ', $queries)); 
    } 
} 

?> 

解析的查詢看起來像這樣(如果你print_r它):

Array 
(
    [0] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Latheesan', 'Kanes', 26); 
    [1] => INSERT INTO myTable (firstname, lastname, age) VALUES ('Adam', 'Smith', 30); 
) 

你有兩個opti對實際進口到DB:

  1. 進口構建SQL查詢的集合,並在批處理(array_chunk)執行它 - 這意味着對你的分貝的查詢。然而,正如你所看到的,即時通訊不檢查CSV的值 - 即我相信我的數據源,而不是逃避任何事情 - 有點危險......

  2. 您執行該查詢,只要您建立與轉義值 - 小的缺點是,它會執行一個查詢每行csv ...

希望這可以幫助。