2014-01-24 35 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 ...

希望这可以帮助。