PHP导入csv到mysql的问题


PHP import csv to mysql issue

我有一个csv文件,几乎有8000行。我需要在数据库中插入一些列。为此,我使用以下代码:

$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 220951.3514593.3514,37%的IDP更新1年许可证,0,0,0,31/10/13 21:16,0,21

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

这里,$csv_array[2]本身有逗号分隔的值,但用引号括起来。我的代码只查找逗号。因此,数据库表中的插入值会有所不同。

2132,JUNIPER,"J,SRX,AX,VGW",基本系统,A,GEN,AX411-KR,适用于韩国的双无线电802.11abgn接入点。不包括电源。,805.4054507.4054,37.01%,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;
        }

您应该使用csv函数,而不是explode函数。

  • str_getcsv
  • fgetcsv
  • SplFileObject::fgetcsv

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

  • 加载数据INFILE

手动跳过某些列的示例

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

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

您忽略了文件中的引号。php的fgetcsv允许您从csv文件中读取文件,并且它将引用字符串周围的引号

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

适用于用作的用例(使用逗号分隔并在字符串周围使用双引号)

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

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

这是将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>