PHP CSV 导入问题

标签 php mysql sql csv

我正在将 CSV 文件导入数据库,这是一个多步骤过程。

步骤如下:

  • 第 1 步:用户上传 CSV 文件。
  • 第 2 步:用户将数据与数据类型相关联。例如,如果 CSV 中的记录包含以下数据:John,Doe,jondoe@gmailcom,用户将从下拉框中选择 firstname 以关联到数据值 John,lastname 从下拉列表中关联到数据值 Doe 的框,以及关联到数据值 johndoe@gmail.com 的下拉框中的电子邮件地址
  • 第 3 步:将数据插入数据库

我的问题如下:

1./在第 3 步,我将拥有用户选择的列和原始数据。

这是原始数据的样子:

$data = array(
 0 => array('John','Doe','johndoe@gmail.com'),
 1 => array('Foo','Bar','foobar@gmail.com')
);

这是我从第 2 步中选择的列的样子:

$columns = array('firstname','lastname','emailaddress')

如何创建如下所示的 sql 查询:

INSERT into contacts (id,firstname,lastname,emailaddress) values (null,'John','Doe','johndoe@gmailcom')

如您所见,sql 查询按列在数组中的顺序选择列,然后是值。我当时在想,由于列是按照数据的顺序选择的,所以我可以假设数据的顺序是正确的,并且与该位置的特定列相关联(例如,我可以假设数据值 ' John' 关联到列数组的第一个位置,反之亦然)。

2./我在考虑一个可能的场景,当用户初始上传文件时,他们可能会发送一个 csv 文件,其中第一条记录有一个空白字段。问题是,我根据 csv 记录中的列数确定让用户关联到数据的列数。在这种情况下,我们有 2 列,每个后续记录都有 3 列。好吧,我不会遍历整个记录集来确定正确的列数。我该如何解决这个问题?有什么想法吗?

编辑

我想我找到了问题 2 的答案。在解析 csv 文件时,我可以得到每条记录的计数,解析结束时的最高计数就是我的计数。好像对吧?有什么问题吗?

最佳答案

要解析 CSV 文件中的数据,请查看 fgetcsv。 http://php.net/manual/en/function.fgetcsv.php

它将从文件中加载一行并返回一个 CSV 字段数组。

$data = array();
while (($lineFields = fgetcsv($handle)) !== false) {
    $data[] = $lineFields;
}

假设您使用的是 PHP5 并使用 $handle 打开文件。在 PHP4 中,fgetcsv 需要第二个参数来表示要读取的行的最大长度。

对于查询:

$sql = "INSERT into contacts (id," + implode(',', $columns) + ") values";

我没有在值之后包含任何内容。您应该创建准备好的语句以防止 sql 注入(inject)。此外,如果您使用的是 MySQL,id 应该是一个自动增量字段并从插入中省略(让 MySQL 生成它)。如果您使用的是 Postgres,则需要为 id 字段创建一个序列。在任何情况下,让数据库为您生成 ID。

关于PHP CSV 导入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14513639/

相关文章:

java - 在没有代码生成的情况下使用jOOQ生成SQL时如何使用jOOQ转换器?

sql - SQLite3 中的 REFERENCES 关键字

php正则表达式在子字符串中查找子字符串

php - 如何在mysql中显示两个日期之间的小时数

java - hibernate 不设置外键

php - 如何生成特定格式的唯一随机数并检查它是否未被使用?

mysql - 在 Hive 中使用 case 语句填充前面的值

php - 可在多个相册文件夹中查找的动态图像库

php - 使用javascript获取url参数并将其发送到php

php - Codeigniter 3.0.0 - 找不到错误 404 页面