PHP导入csv到mysql问题

时间:2013-11-19 23:37:23

标签: php mysql file csv

我有一个近8000行的csv文件。我需要将som e列插入数据库。为此,我使用以下代码:

$csv_file = $_FILES[file][tmp_name];
$csvfile = fopen($csv_file, 'r');
$theData = fgets($csvfile);
$i = 0;
while (!feof($csvfile))
{
        $csv_data[] = fgets($csvfile, 1024);
        $csv_array = explode(",", $csv_data[$i]);
        $insert_csv = array();
        $insert_csv['code'] = $csv_array[6];
        $insert_csv['description'] = $csv_array[7];
        $insert_csv['rrp'] =$csv_array[8];
        $insert_csv['buy'] = $csv_array[9];
        $insert_csv['stock'] = $csv_array[11];
        if($insert_csv['code']!="" && $insert_csv['description']!="" && $insert_csv['rrp']!="" || $insert_csv['buy']!="" || $insert_csv['stock']!="")
        {
            $query = "INSERT INTO pricing (code, description,rrp,buy,stock,distributor,vendor,version) VALUES
                     ('".$insert_csv['code']."','".$insert_csv['description']."','".$insert_csv['rrp']."','".$insert_csv['buy']."','".$insert_csv['stock']."',
                     '".$d."','".$v."','".$version."')";
            $n=mysql_query($query, $con);
        }
        $i++;
}
    fclose($csvfile);
    header('Location: import.php?success=1'); die;

但问题是,有时某些列本身具有逗号分隔值。因此使用我的代码很难插入数据库。因此,插入值将是错误的列值。

例如:

正确的csv数据:(这将正确插入数据库)

2132,JUNIPER,内容订阅,第一年订阅,A,GEN,SRX220-IDP,SRX的IDP更新1年许可证220,951.3514,599.3514,37%,0,0,0,0,31 / 10/13 21:16,0,21

但有时csv文件包含以下行格式:

这里$ csv_array [2]本身有逗号分隔值,但用引号括起来。我的代码只是寻找逗号。因此,db表中的插入值将不同。

2132,JUNIPER,“J,SRX,AX,VGW”,基本系统,A,GEN,AX411-KR,韩国双无线电802.11abgn接入点。电源不包括在内,805.4054,507.4054,37.01%,0,0,0,0,31 / 10/13 21:16,0,21

我该如何解决?

谢谢!

更新

if ($_FILES[file][size] > 0)
        {
            //get the csv file
            $file = $_FILES[file][tmp_name];
            $handle = fopen($file,"r");
            fgetcsv($handle,10000,",");
            //loop through the csv file and insert into database
            do
            {
                if ($data[0])
                {
                    mysql_query("INSERT INTO pricing (code, description,rrp,buy,stock,distributor,vendor,version) VALUES
                (
                    '".addslashes($data[6])."',
                    '".addslashes($data[7])."',
                    '".addslashes($data[8])."',
                    '".addslashes($data[9])."',
                    '".addslashes($data[11])."',
                    '".$d."',
                    '".$v."',
                    '".$version."'
                )
            ");
                }
            } while ($data = fgetcsv($handle,1000,',','"'));

            header('Location: import.php?success=1'); die;

        }

3 个答案:

答案 0 :(得分:4)

您应该使用csv函数代替explode

甚至可以直接将csv文件加载到mysql

手动示例跳过某些列

  

您还可以通过将输入值分配给用户变量而不将变量分配给表格列来丢弃输入值:

LOAD DATA INFILE 'file.txt'
  INTO TABLE t1
  (column1, @dummy, column2, @dummy, column3);

答案 1 :(得分:1)

你忽略了文件中的引号。 php的fgetcsv允许你从csv文件中读取一个文件,它会尊重字符串的引号

array fgetcsv ( resource $handle [, int $length = 0 [, string $delimiter = ',' [, string $enclosure = '"' [, string $escape = '\\' ]]]] )

适应您的用例(使用逗号分隔和字符串双引号),用作

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

表面阅读CSV文件看起来非常简单,实际上有许多特殊情况需要考虑,这就是为什么使用标准,经过良好测试和多功能的功能始终是您的最佳选择。

答案 2 :(得分:0)

这是将CSV文件导入mysql且没有重复记录的最佳代码,它显示了插入了多少条记录以及有多少条重复的结果

<?php
    $duplicate=0;
    $record=0;
    $total=0;
    $conn=mysql_connect("localhost","","","") or die(mysql_error());
    mysql_select_db("svn",$conn);
    ini_set('max_execution_time', 300);
    if(isset($_POST['submit']))
    {
    $file=$_FILES['file']['tmp_name'];

    $handle=fopen($file,"r");
    while(($fileop=fgetcsv($handle,1000,",")) !== false)
    {
    if(! get_magic_quotes_gpc() )
    {
    $fn= addslashes ($fileop[0]);
    $ln=addslashes ($fileop[1]);
    $ti=addslashes ($fileop[2]);
    $ac=addslashes ($fileop[3]);
    $em=addslashes ($fileop[4]);
    $op=addslashes ($fileop[5]);
    $mp=addslashes ($fileop[6]);
    $fx=addslashes ($fileop[7]);
    $ad=addslashes ($fileop[8]);
    $co=addslashes ($fileop[9]);
    $st=addslashes ($fileop[10]);
    $ci=addslashes ($fileop[11]);
    $zc=addslashes ($fileop[12]);
    }
    else
    {
    $fn= $fileop[0];
    $ln=$fileop[1];
    $ti=$fileop[2];
    $ac=$fileop[3];
    $em=$fileop[4];
    $op=$fileop[5];
    $mp=$fileop[6];
    $fx=$fileop[7];
    $ad=$fileop[8];
    $co=$fileop[9];
    $st=$fileop[10];
    $ci=$fileop[11];
    $zc=$fileop[12];
    }


    $query=mysql_query("SELECT * FROM test WHERE email='$em'");
     if(mysql_num_rows($query)>0)
      {

       $duplicate=$duplicate+1;
      }
    else
      {
      $record=$record+1;
    $sql=mysql_query("INSERT INTO test(first_name,last_name,title,account,email,officephone,mobphone,fax,address,country,state,city,zipcode) 
    VALUES('$fn','$ln','$ti','$ac','$em','$op','$mp','$fx','$ad','$co','$st','$ci','$zc')");
    }
    }

    echo"Data inserted successfully";

    echo "<table width='600' cellpadding='5' cellspacing='5' border='1'>";
    echo "<tr>"."<td>"."Record inserted"."</td>"."<td>".$record."</td>"."</tr>";
    echo "<tr>"."<td>"."duplicate record"."</td>"."<td>".$duplicate."</td>"."</tr>";
    echo "<tr>"."<td>"."Total records"."</td>"."<td>".$total=$record + $duplicate."</td>"."</tr>";
    echo "</table>";


    }

    ?>
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <?
    $duplicate=0;
    $record=0;
    $total=0;
    ?>
    </head>
    <body>

    <form action="index.php" method="post" enctype="multipart/form-data">
     <input type="file" name="file" value="selectfile"/><br/>
        <input type="submit" name="submit" value="Submit" />
    </form>
    </body>
    </html>