上传CSV文件并导入mysql会出错

时间:2012-01-15 00:10:17

标签: php mysql csv fopen

我使用以下脚本从CSV文件将数据导入我的mysql数据库。 CSV的设置如下:

Name  Postcode
fred  hd435hg
bob   dh345fj

上面是它在excel中的样子,在记事本中看到的原始csv格式看起来像这样:

name,postcode
frank,ng435tj

我遇到的问题是由于某种原因邮政编码列根本没有导入,标题行也被导入作为记录,是否可以跳过第一行?我已经完成了代码并且无法理解为什么邮政编码没有被提取,这很奇怪。

        <?php
    //database connect info here

    //check for file upload
    if(isset($_FILES['csv_file']) && is_uploaded_file($_FILES['csv_file']['tmp_name'])){

        //upload directory
        $upload_dir = "./csv";

        //create file name
        $file_path = $upload_dir . $_FILES['csv_file']['name'];

        //move uploaded file to upload dir
        if (!move_uploaded_file($_FILES['csv_file']['tmp_name'], $file_path)) {

            //error moving upload file
            echo "Error moving file upload";

        }

        //open the csv file for reading
        $handle = fopen($file_path, 'r');


        while (($data = fgetcsv($handle, 1000, ',')) !== FALSE) {

            //Access field data in $data array ex.
            $name = $data[0];
            $postcode = $data[1];

            //Use data to insert into db
            $sql = sprintf("INSERT INTO test (name, postcode) VALUES ('%s',%d)",
                        mysql_real_escape_string($name),
                        $postcode
                        );
            mysql_query($sql) or (mysql_query("ROLLBACK") and die(mysql_error() . " - $sql"));
        }


        //delete csv file
        unlink($file_path);
    }
    ?>

2 个答案:

答案 0 :(得分:2)

您的CSV文件实际上似乎是TSV文件。它不使用逗号,而是使用制表符来分隔字段。

因此您需要更改fgetcsv来电。而不是','使用标签:

 while (($data = fgetcsv($handle, 1000, "\t") ...

要跳过标题行,请在while块之前添加另一个人造fgetcsv

 fgetcsv($handle);
 while (...) {

那将跳过第一行。 (一个简单的fgets也可以。)


哦,刚刚注意到:邮政编码可能也会被删除,因为你将{1}} sprintf占位符%d连接到字符串中为$postcode。如果该字段实际上包含字母,就像在您的示例中那样,则不起作用。 - 虽然我认为打印输出只是一个错误的例子。

答案 1 :(得分:0)

试试这个。

$file = $_FILES['file']['tmp_name'];

        $handle = fopen($file,"r");

        while(($fileop = fgetcsv($handle,1000,",")) !==false)
        {
            $username = $fileop[0];
            $name = $fileop[1];
            $address = $fileop[2];

            $sql = mysql_query("INSERT INTO ...... ");
        }