【问题标题】:upload and import csv file into multiple table in mysql [closed]将csv文件上传并导入mysql中的多个表[关闭]
【发布时间】:2012-07-24 13:49:33
【问题描述】:

我想在 php 中创建和上传页面,并将上传的 csv 文件数据导入到多个表中。尝试在这里搜索,但似乎找不到从 csv 导入到多个表的任何内容。非常感谢这里的任何帮助。谢谢你。

【问题讨论】:

  • 多表是什么意思:是所有数据进入多个表,还是一些数据进入一个表,其他数据进入另一个等等?
  • 是的,我的意思是一些行的数据进入一个表,其他进入另一个表。
  • 您找到可行的解决方案了吗?
  • 这很有帮助,但看起来我无法将它用于我的项目,因为 csv 应该为用户提供从数据库中获取的下拉选择。所以我必须为此使用另一种方式。

标签: php mysql csv import


【解决方案1】:

作为上面提出的另一个变体,您可以逐行读取 CSV 并将每一行分解为字段。每个字段对应一个变量。

$handle = fopen("/my/file.csv", "r"); // opening CSV file for reading
if ($handle) { // if file successfully opened
    while (($CSVrecord = fgets($handle, 4096)) !== false) { // iterating through each line of our CSV

        list($field1, $field2, $field3, $field4) = explode(',', $CSVrecord); // exploding CSV record (line) to the variables (fields)

        // and here you can easily compose SQL queries and map you data to the tables you need using simple variables

    }
    fclose($handle); // closing file handler
}

【讨论】:

  • 最好使用 fgetcsv php.net/manual/en/function.fgetcsv.php 而不是 fgets。在这种情况下 list 和 explode 可以删除。
  • @BerndOtt,你是对的! :),但如果您需要将数据映射到变量(bec。您将获得列表(数组)),它不会减少代码行。但是,如果仅使用数组就足够了-您的提议会更好!
  • 我想说:这是关于读取 csv 文件的。 fgetcsv 关心转义,也许关心 RFC 4180。 Explode 函数不关心。该数组很好,因为您可以直接将它与某些 db(例如 sqlsvr)连接器一起使用,作为防止 sql 注入的参数。
【解决方案2】:

如果您有权访问 PHPmyadmin,则可以将 CSV 上传到那里。然后将 if 复制到每个所需的表中

【讨论】:

  • 我可以在 phpmyadmin 中导入,但这是用户将数据导入数据库的 gui。我是 php 和 mysql 的初学者,所以不太清楚如何去做。
  • 只要 csv 值(以逗号分隔)与 db_table 中的字段完全匹配,就会直接导入。否则,您将在不正确的位置获得数据。请记住,如果一列是空的,则在 csv 文件中将其作为 ,。
  • 是的,明白,但是如果 col1, col2, col3 应该导入 table1 和 col4, col5, col6 应该使用 csv 文件导入 table2?
  • 它们需要被分成不同的表。使用 excel 打开 csv 并拆分列
  • @mlishn: 像这样编写脚本任务的目的当然是为了避免在 excel 中跳过这些麻烦(其他电子表格程序可用 :-))?
【解决方案3】:

针对您的评论,即某些数据将进入一个表而其他数据将进入另一个表,这里是一个简单的示例。

Table1 有 3 个字段:姓名、年龄和性别。 Table2 有 2 个字段:头发颜色、鞋码。所以你的 CSV 可以这样布局:

john smith,32,m,blonde,11
jane doe,29,f,red,4
anders anderson,56,m,grey,9

对于下一步,您将使用函数fgetcsv。这会将 csv 的每一行分解为一个数组,然后您可以使用该数组来构建您的 SQL 语句:

if (($handle = fopen($mycsvfile, "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        // this loops through each line of your csv, putting the values into array elements
        $sql1 = "INSERT INTO table1 (`name`, `age`, `sex`) values ('".$data[0]."', '".$data[1]."', '".$data[2]."')";
        $sql2 = "INSERT INTO table2 (`haircolour`, `shoesize`) values ('".$data[3]."', '".$data[4]."')";
    }
    fclose($handle);
}

请注意,这并没有考虑任何 SQL 安全性,例如验证,但这基本上是它的工作方式。

【讨论】:

    【解决方案4】:

    在我看来,问题是要区分哪个字段用于哪个表。 当您发送像

    这样的标头时
     table.field, table.field, table.field
    

    然后拆分表头,你会得到所有的表和字段。

    这是一条路吗?

    一切顺利

    ps:因为你的评论...

    一个 csv 文件有/可以有第一行,其中包含字段名。当需要将 csv 数据复制到多个表中时,您可以使用一种解决方法来找出哪个字段适用于哪个表。

     user.username, user.lastname, blog.comment, blog.title
     "sam"        , "Manson"     , "this is a comment", "and I am a title"
    

    现在,在读取 csv 数据时,您可以在第一行上工作,在点处拆分标题以找出使用的表格以及字段。

    使用此方法,您可以将 csv 数据复制到多个表中。

    但这意味着,你必须先编码:(

    拆分字段名

    // only the first line for the fieldnames
    $topfields = preg_split('/,|;|\t/')
    foreach( $topfields as $t => $f ) {
       // t = tablename, f = field
    }
    

    【讨论】:

    • 对不起,我是初学者,对您的评论一无所知。
    • 充满希望!你能和我分享一下如何编写代码吗?是使用explode然后使用sql insert语句吗?
    【解决方案5】:
    if (($handle = fopen($mycsvfile, "r")) !== FALSE) {
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
            // this loops through each line of your csv, putting the values into array elements
            $sql1 = "INSERT INTO table1 (`name`, `age`, `sex`) values ('".$data[0]."', '".$data[1]."', '".$data[2]."')";
            $sql2 = "INSERT INTO table2 (`haircolour`, `shoesize`) values ('".$data[3]."', '".$data[4]."')";
        }
        fclose($handle);
    }
    

    在上面的代码中,您使用了两个插入查询,您将如何运行这些查询?

    【讨论】:

    • 我想做同样的事情,但谁能帮我在 mysql_query 中运行这两个查询?
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2016-06-05
    • 2020-05-18
    • 2015-10-06
    • 2014-10-31
    相关资源
    最近更新 更多