【问题标题】:uploading csv file into mysql through php通过php将csv文件上传到mysql
【发布时间】:2012-03-14 06:56:05
【问题描述】:

我知道如何将 csv 文件上传到 mysql 数据库,但只能通过 cmd。我想知道如何使用 php 表单将 csv 文件上传到 mysql 数据库中,并且会忽略 excel 上的一些信息,并且只会从某一行开始导入。 ?请帮助我。

【问题讨论】:

  • 我知道您说过您可以从 cmd 行执行此操作,并且需要加载某些信息(特定字段?)并从某个行开始 - 加载数据 infile 允许此功能.. 并允许字段加载导入时计算的表达式结果。如果您当然可以正确操作数据,它比单独的行插入要快方式

标签: php mysql csv


【解决方案1】:

(PHP 4,PHP 5)

fgetcsv

见php手册http://php.net/manual/en/function.fgetcsv.php

<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
        echo "<p> $num fields in line $row: <br /></p>\n";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . "<br />\n";
        }
    }
    fclose($handle);
}
?>

【讨论】:

  • 我认为问题是将 csv 直接上传到数据库......就像 exec 函数中的一些命令......
  • @Saiyam Patel 仔细阅读问题..“我知道如何将 csv 文件上传到 mysql 数据库,但只能通过 cmd。我想知道如何使用 php 将 csv 文件上传到 mysql 数据库”跨度>
  • 如果重要数据从第 10 行开始,并且前面的行包含信息但它们并不那么重要,那么这些是否有效,因此导入必须跳过第 1-9 行并且仅从第 10 行开始?谢谢
【解决方案2】:

试试这个效果很好,您可以根据 CSV 文件中的列数添加尽可能多的值。然后在 HTML 代码中将上传语法放在标签中。

**

$fname = $_FILES['csv_file']['name'];     
$chk_ext = explode(".",$fname);             

        $filename = $_FILES['csv_file']['tmp_     name'];   
$handle = fopen($filename, "r");      
if(!$handle){
die ('Cannot open file for reading');
}      
              while (($data = fgetcsv($handle,     10000, ",")) !== FALSE)
{
          $query = "INSERT INTO tablename       (col1_csv, col2_csv)
values ('$data[0]', '$data[1]');
mysql_query($query) or die(mysql_error    ());
}
 fclose($handle);
?>

**

【讨论】:

  • 但并不是说我可以在导入前跳过几行。
  • 跳过几行?在您正在上传的 CSV 文件中,或者您有一条需要覆盖的记录,这样它就不会出现两次。如果是这种情况,您可以在 mysql 查询中应用 DUPLICATE
  • 否,例如需要导入的数据将从第 10 行开始,因为第 1-9 行是无关紧要的文本。
【解决方案3】:

您可以使用 MySQL LOAD DATA INFILE 语句一次批量插入数千条记录。 PHP 可以处理文件上传。 PHP 代码类似于:

$query = sprintf("
    LOAD DATA LOCAL INFILE '%s'
    INTO TABLE `table1`
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY '\\r\\n'
    IGNORE 1 LINES
    ",
    mysql_real_escape_string($FILES["file1"]["tmp_name"])
);

LOCAL 关键字应该允许您解决一些安全限制。更改FIELDS TERMINATED BYLINES TERMINATED BY 参数以匹配导出时excel 使用的分隔符。 IGNORE 1 LINES 告诉 MySQL 跳过标题行。

注意:Excel 似乎没有使用转义字符;但它将 (i) 将包含 ," 的字段与 " (ii) 使用 "" 转义单个 " 内部数据。我相信 MySQL 会理解这种编码并正确导入数据。

【讨论】:

  • 您好,我使用了您的 php 脚本并且它有效,我对其进行了一些修改。但是,我如何能够检查一个数据是否已经在数据库中,以便如果用户不小心选择了同一个 csv 文件,则会弹出一个错误并通知他一些数据已经在数据库中。谢谢。
  • 我在语句的某处使用了忽略或替换关键字。谢谢
【解决方案4】:

您可以将“LOAD DATA INFILE”语句与“IGNORE ... LINES”选项一起使用,您可以在命令行和 PHP 中使用该选项。

【讨论】:

    【解决方案5】:

    试试这个:

     $filename=$_FILES["upload_file"]["name"];
     $extension = end(explode(".",$filename));
     if ($extension=='csv') {
         $tmp_file=$_FILES["upload_file"]["tmp_name"];
         $handle = @fopen($tmp_file, "r");
         //specify your own database connection parameter
         $db = new PDO('mysql:host=localhost;dbname=demo','user','password');
         $stmt = $db->prepare("INSERT INTO writers (writer_name, writer_email) VALUES (?, ?)");
         if ($handle) {
            while (($buffer = fgets($handle, 4096)) !== false) {
                $array=explode(",",$buffer);
                $count=1;
                foreach ($array as $value) {
                    $stmt->bindParam($count, $value);
                    $count++;
                }
                $stmt->execute();
            }
            if (!feof($handle)) {
                echo "Error: unexpected fgets() fail\n";
            }
            fclose($handle);
            }
            $db = null;
            echo "<p>Success</p>";
        }
        else {
            $error="<p style='color:red;'>Invalid file type</p>";
        }
    

    参考http://pradipchitrakar.com.np/programming/upload-csv-mysql-php/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-11
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2015-06-10
      • 2013-01-17
      • 1970-01-01
      相关资源
      最近更新 更多