1

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

4

5 回答 5

1

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

于 2012-07-24T13:53:25.570 回答
1

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

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 安全性,例如验证,但这基本上是它的工作方式。

于 2012-07-24T14:55:47.633 回答
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
}
于 2012-07-24T21:05:27.530 回答
0

在我看来,这个问题似乎是区分哪个字段用于哪个表。当您发送标头时

 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
}
于 2012-07-24T13:54:19.507 回答
0
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);
}

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

于 2013-10-24T10:53:56.817 回答