Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.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 上载CSV文件并导入mysql时出错_Php_Mysql_Csv_Fopen - Fatal编程技术网

Php 上载CSV文件并导入mysql时出错

Php 上载CSV文件并导入mysql时出错,php,mysql,csv,fopen,Php,Mysql,Csv,Fopen,我使用以下脚本将数据从CSV文件导入mysql数据库。CSV的设置如下所示: Name Postcode fred hd435hg bob dh345fj name,postcode frank,ng435tj 以上是excel中的外观,在记事本中查看原始csv格式时,外观如下: Name Postcode fred hd435hg bob dh345fj name,postcode frank,ng435tj 我遇到的问题是,出于某种原因,邮政编码列根本没有被导入,同时

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

Name  Postcode
fred  hd435hg
bob   dh345fj
name,postcode
frank,ng435tj
以上是excel中的外观,在记事本中查看原始csv格式时,外观如下:

Name  Postcode
fred  hd435hg
bob   dh345fj
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);
    }
    ?>

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

因此,您需要更改呼叫。使用以下选项卡代替
,”

 while (($data = fgetcsv($handle, 1000, "\t") ...
要同时跳过标题行,请在while块之前添加另一个faux
fgetcsv

 fgetcsv($handle);
 while (...) {
这将跳过第一行。(简单的
fgets
也可以。)


哦,刚刚注意到:邮政编码也可能会被删除,因为您使用
$postcode
占位符
%d
将其作为小数点压缩到字符串中。如果该字段实际上包含lettery,如您的示例中所示,那么这将不起作用。-尽管我认为这只是一个错误的打印输出示例。

试试这个

$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 ...... ");
        }

嗨,对不起,那是因为我在excel中打开它,如果我在记事本中打开它,它看起来是这样的哦,好的。那么请忽略我目前为止的所有理论。但是邮政编码实际上包含字母吗?还是像人们对邮政编码所假设的那样是数字的?顺便问一下,英国邮政编码有数字和字母,那么正确的sprintf占位符是什么呢?您确实需要使用
%s
和mysql转义函数,就像第一个字段一样。(如果您想在将来节省一些时间,这可能是一个很好的研究机会。比sprintf和手动转义简单得多。)