使用PHP/MySQL导入CSV数据

Pid*_*dge 27 php mysql database csv import

我在尝试从CSV导入数据时遇到了一些问题,并且有一些问题,我还没有设法自己解决.

首先,这是我的代码,以帮助把事情放在透视中(整理一下,删除CSS和数据库连接):

<body>
<div id="container">
<div id="form">

<?php
$deleterecords = "TRUNCATE TABLE tablename"; //empty the table of its current records
mysql_query($deleterecords);

//Upload File
if (isset($_POST['submit'])) {

    if (is_uploaded_file($_FILES['filename']['tmp_name'])) {
        echo "<h1>" . "File ". $_FILES['filename']['name'] ." uploaded 
 successfully." . "</h1>";
        echo "<h2>Displaying contents:</h2>";
        readfile($_FILES['filename']['tmp_name']);
    }

    //Import uploaded file to Database
    $handle = fopen($_FILES['filename']['tmp_name'], "r");

    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $import="INSERT into importing(text,number)values('$data[0]','$data[1]')";

        mysql_query($import) or die(mysql_error());
    }

    fclose($handle);

    print "Import done";

//view upload form
} else {

    print "Upload new csv by browsing to file and clicking on Upload<br />\n";

    print "<form enctype='multipart/form-data' action='upload.php' method='post'>";

    print "File name to import:<br />\n";

    print "<input size='50' type='file' name='filename'><br />\n";

    print "<input type='submit' name='submit' value='Upload'></form>";

}

?>

</div>
</div>
</body>
Run Code Online (Sandbox Code Playgroud)

它基本上是我在各种方法多次尝试后发现的一个例子的改编.

我的CSV有两列数据,第一列是文本,第二列是整数数据库中的表也有两列,第一列称为"文本",第二列称为"数字"

所以我的问题是:

  1. 正在上传的文本只是在每个字段中显示为0,我不知道为什么
  2. 我一直在阅读最后附在""中的数据,如果发生这种情况我将如何排序?
  3. 如何忽略标题的CSV的前X行?
  4. 是整个过程中更改的数据格式还是我可以在图表中使用它?例如,一旦放入数据库中,小数会保留小数吗?

我认为这涵盖了一切,提前感谢任何帮助!

编辑:

刚刚完成了10,000条记录上传的测试并得到了错误:

"致命错误:超过30秒的最大执行时间"

有什么想法吗?

SDC*_*SDC 69

前几天我回答了一个几乎完全相同的问题:将CSV文件保存到mysql数据库中

MySQL有一个功能LOAD DATA INFILE,它允许它直接在单个SQL查询中导入CSV文件,而不需要通过PHP程序循环处理它.

简单的例子:

<?php
$query = <<<eof
    LOAD DATA INFILE '$fileName'
     INTO TABLE tableName
     FIELDS TERMINATED BY '|' OPTIONALLY ENCLOSED BY '"'
     LINES TERMINATED BY '\n'
    (field1,field2,field3,etc)
eof;

$db->query($query);
?>
Run Code Online (Sandbox Code Playgroud)

就这么简单.

没有循环,没有大惊小怪.和很多很多比PHP解析它更快.

MySQL手册页:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

希望有所帮助

  • 这样安全吗?恶意用户可能会将 sql 放入文件中并危害数据库? (2认同)

jit*_*jit 6

$i=0;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if($i>0){
    $import="INSERT into importing(text,number)values('".$data[0]."','".$data[1]."')";
    mysql_query($import) or die(mysql_error());
}
$i=1;
}
Run Code Online (Sandbox Code Playgroud)