【问题标题】:Import a CSV file into MySQL using PHP使用 PHP 将 CSV 文件导入 MySQL
【发布时间】:2012-05-19 05:45:46
【问题描述】:

我正在尝试使用 fgetcsv 函数将 CSV 数据导入 MySQL 数据库。

if(isset($_POST['submit'])) {
     $fname = $_FILES['sel_file']['name'];
     $var = 'Invalid File';
     $chk_ext = explode(".",$fname);

     if(strtolower($chk_ext[1]) == "csv") {
         $filename = $_FILES['sel_file']['tmp_name'];
         $handle = fopen($filename, "r");
     $res = mysql_query("SELECT * FROM vpireport");
     $rows = mysql_num_rows($res);
     if($rows>=0) {
        mysql_query("DELETE FROM vpireport") or die(mysql_error());

        for($i =1;($data = fgetcsv($handle, 10000, ",")) !== FALSE; $i++) {
            if($i==1)
            continue;
            $sql = "INSERT into vpireport
                                    (item_code,
                                     company_id,
                                     purchase,
                                     purchase_value) 
                                     values
                                    (".$data[0].",
                                     ".$data[1].",
                                     ".$data[2].",
                                     ".$data[3].")";
            //echo "$sql";
            mysql_query($sql) or die(mysql_error());
        }
    }

     fclose($handle);
    ?>
     <script language="javascript">
     alert("Successfully Imported!");
     </script>
     <?
 }

问题是它卡在导入过程之间并显示以下错误:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的 'S',0,0)' 附近

每次只导入部分文件。 10000 行文件中仅导入 200-300 行。

这是我的表的 DDL:

create table vpireport (
    id int not null auto_increment,
    item_code int,
    company_id int,
    purchase double,
    primary key(id),
    foreign key(company_id) references users(userid)
);

到目前为止,我还没有找到问题所在,感谢任何帮助。谢谢。

【问题讨论】:

标签: php mysql fgetcsv


【解决方案1】:

您可能需要转义引号,这可以使用PDO 和prepared statements 来完成。

为了简洁起见,我跳过了示例中的大部分代码,只关注for 循环。

<?php

    // Use PDO to connect to the DB
    $dsn = 'mysql:dbname=YOUR_DB;host=localhost';
    $user = 'DB_USERNAME';
    $password = 'DB_PASSWORD';

    try {
        $dbh = new PDO($dsn, $user, $password);
    } catch (PDOException $e) {
        echo 'Connection failed: ' . $e->getMessage();
    }

    for($i =1;($data = fgetcsv($handle, 10000, ",")) !== FALSE; $i++) {
        // The query uses placeholders for data
        $sql = "INSERT INTO vpireport
                    (item_code,company_id,purchase,purchase_value) 
                VALUES
                    (:item_code,:company_id,:purchase,:purchase_value)";
        $sth = $dbh->prepare($sql);

        // The data is bound to the placeholders
        $sth->bindParam(':item_code', $data[0]);
        $sth->bindParam(':company_id', $data[1]);
        $sth->bindParam(':purchase', $data[2]);
        $sth->bindParam(':purhcase_value', $data[3]);

        // The row is actually inserted here
        $sth->execute();
        $sth->closeCursor();
    }

不过,这不会消除任何问题字符,因此如果出现问题,您可能需要查看某种数据清理方法。

【讨论】:

    【解决方案2】:

    取消注释 //echo "$sql";看看最后一个查询是什么(有错误) - 可能是 csv 数据包含奇怪的字符或查询被切断。

    顺便说一句:你也可以通过mysql导入csv文件:
    http://dev.mysql.com/doc/refman/5.1/en/load-data.html

    【讨论】:

      【解决方案3】:
      $row = 1;
      
      if (($handle = fopen("albums.csv", "r")) !== FALSE) {
          while (($data = fgetcsv($handle, 1000, ',','"')) !== FALSE) {
                  if($row!=1){    
                      $num = count($data);
                      $albumIndex=0;
      
                      //Insert into tbl_albums 
      
                      $sqlAlbums="INSERT INTO tbl_albums(albumName) VALUES ('".$data[$albumIndex]."')";
                      $resultAlbums=mysql_query($sqlAlbums);
      
      
      
                      }
                  }
                  $row++;
      
                  }
              }
      fclose($handle);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-10
        • 1970-01-01
        相关资源
        最近更新 更多