2012-05-18 153 views
1

我想让用户从一个.csv文件(从各种联系人管理程序导出)将他们的联系人上传到服务器,然后将它保存在mysql中。从我在SO和其他地方阅读的内容中,MYSQL可以使用LOAD DATA INFILE导入数据。它似乎也有一个本地选项来从客户端获得它。我的三部分问题是:我是否需要使用文件上传将文件传输到服务器,或者我可以通过LOAD DATA INFILE的LOCAL选项直接访问它?由于应用程序将为他们的联系人服务多个用户,我应该将所有联系人放在一个表中吗?由于不同的用户在.csv文件中会有不同的结构,处理不同.csv文件中字段名/模式差异的最佳方法是什么?PHP/MYSQL上传,将.csv文件导入到mysql-process-table设计

暂定代码:

<html> 
<body> 
<form action="getcsvile.php" method="post" 
enctype="multipart/form-data"> 
<input type="file" size=12 name="file" id="file" /><input type="submit" name="submit" value="Upload CSV File" /></form> 
<body> 
</html> 

<?php 
$userid = $_SESSION['userid']; 
//error checking to make sure .csv file and other requirements met...then 
//get extension, set to $ext 
$target = "csvfiles/".$userid.".".$ext; 
move_uploaded_file($_FILES["file"]["tmp_name"],$target); 
//NEED TO PARSE DATA USING fgetcsv or something to examine, clean up csv data? 
$sql = "LOAD DATA LOCAL INFILE '$target' INTO TABLE contacts FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES";// IS LOCAL right? 
MySQL_query($sql); 
$sql2 = "UPDATE contacts SET userid = '$userid'; 
MySQL_query($sql2); 
echo "success; 

这个问题似乎是一个正确的方法呢?如何容纳来自不同用户的不同csv文件有多难?

非常感谢。

回答

3
  1. 请记住,从MySQL的角度来看,“客户端”是直接连接到它的应用程序。在你的情况下,这是PHP。 PHP的“客户端”是用户的网络浏览器并不重要,而且你几乎肯定不希望你的用户直接连接到MySQL服务器。

    因此,如果文件在不同的机器上运行,您可以使用LOCAL将文件从PHP传递到MySQL,但如果它们位于同一台计算机上,那么这将不必要,并且MySQL可以从PHP已经写了这个文件。

  2. 这实际上取决于你将如何处理数据,但总的来说 - 是的,把它放在一张表中。

  3. LOAD DATA声明中,您可以告诉MySQL CSV表中的哪些列在表中 - 您可以根据文件内容(特别是如果它包含标题行)进行猜测,或者基于用户提供的提示,例如CSV源自哪个软件;或者,如果您无法确定CSV如何映射到表格,则可以在浏览器中向用户提供一个简短示例,并要求他们解决该问题。

+0

什么是语法来映射csv文件中的列到表?我想我可以阅读所有的列头,并使用开关,以便首先将姓名,名字等映射到第一位,然后将zip,zipcode等全部映射到zip。 – user1260310

0

按照以下步骤导入CSV联系人文件

使用第1步:上传文件的HTML表单。 第2步。使用fopen打开文件。

Example $file=fopen($_FILES['file1']['tmp_name'],'r'); 

步骤3.阅读文件的使用fgetcsv内容。在这里你有while循环

示例使用: -

while($data = fgetcsv ($handle, 3000, ",")) 
{ 
     //write sql query to insert data in database 
     $q="insert into contacts values($data[0],$data[1])"; 
} 

如果你想允许多个用户上传的文件,不同的结构。创建一个列映射器。例如,给他们像下面的东西

User File Fields   Mapping Fields (Database table fields) 
Field 1     Name    //Here you have to give a drop down menu 
Field 2     Phone Number  //Here you have to give a drop down menu 
Field 3     Email Address  //Here you have to give a drop down menu 
+0

这比使用'LOAD DATA INFILE慢得多' – Daan