Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MYSQL上传,导入.csv文件到MYSQL进程表设计_Php_Mysql_Csv_Upload - Fatal编程技术网

PHP/MYSQL上传,导入.csv文件到MYSQL进程表设计

PHP/MYSQL上传,导入.csv文件到MYSQL进程表设计,php,mysql,csv,upload,Php,Mysql,Csv,Upload,我想让用户将他们的联系人从.csv文件(从各种联系人管理程序导出)上传到服务器,然后保存在mysql中。根据我在SO和其他地方读到的内容,MYSQL可以使用LOAD data INFILE导入数据。似乎还有一个从客户端获取的本地选项。我的问题分为三个部分:我需要使用文件上传将文件上传到服务器,还是可以通过本地加载数据填充选项直接访问文件?由于应用程序将为多个用户提供联系人服务,我是否应该将所有联系人放在一个表中?由于不同的用户在其.csv文件中具有不同的结构,处理不同.csv文件中的字段名/模式

我想让用户将他们的联系人从.csv文件(从各种联系人管理程序导出)上传到服务器,然后保存在mysql中。根据我在SO和其他地方读到的内容,MYSQL可以使用LOAD data INFILE导入数据。似乎还有一个从客户端获取的本地选项。我的问题分为三个部分:我需要使用文件上传将文件上传到服务器,还是可以通过本地加载数据填充选项直接访问文件?由于应用程序将为多个用户提供联系人服务,我是否应该将所有联系人放在一个表中?由于不同的用户在其.csv文件中具有不同的结构,处理不同.csv文件中的字段名/模式差异的最佳方法是什么

暂定代码:

<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;

  • 请记住,从MySQL的角度来看,“客户机”是直接连接到它的应用程序。在您的例子中,这就是PHP。PHP的“客户端”是用户的web浏览器这一事实与此无关——而且您几乎肯定不希望用户直接连接到MySQL服务器

    因此,如果PHP在不同的机器上运行,您可以使用
    LOCAL
    将文件从PHP传递到MySQL,但是如果它们在同一台机器上,并且MySQL可以从PHP编写文件的任何地方读取文件,则这是不必要的

  • 这实际上取决于你将如何处理这些数据,但总的来说——是的,把它们都放在一个表中

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


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

    第一步。使用HTML表单上传文件。 第二步。使用fopen打开文件

    Example $file=fopen($_FILES['file1']['tmp_name'],'r');
    
    第三步。使用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
    

    这比使用
    加载数据填充
    将csv文件中的列映射到表的语法要慢得多?我想我可以阅读所有的列标题并使用一个开关,使cases first、firstname等都映射到first和zip、zipcode等。都映射到zip。。