PHP CSV导入问题

PHP CSV导入问题,php,mysql,sql,csv,Php,Mysql,Sql,Csv,我正在将CSV文件导入数据库,这是一个多步骤的过程 以下是步骤: 步骤1:用户上载CSV文件 步骤2:用户将数据与数据类型关联。例如,如果CSV中的记录包含以下数据:John,Doe,jondoe@gmailcom,用户将从下拉框中选择firstname与数据值John关联,从与数据值Doe关联的下拉框中选择lastname,以及与数据值关联的下拉框中的emailaddressjohndoe@gmail.com 步骤3:将数据插入数据库 我的问题如下: 1./在步骤3中,我将拥有用户选择的列

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

以下是步骤:

  • 步骤1:用户上载CSV文件
  • 步骤2:用户将数据与数据类型关联。例如,如果CSV中的记录包含以下数据:
    John,Doe,jondoe@gmailcom
    ,用户将从下拉框中选择firstname与数据值John关联,从与数据值Doe关联的下拉框中选择lastname,以及与数据值关联的下拉框中的emailaddressjohndoe@gmail.com
  • 步骤3:将数据插入数据库
我的问题如下:

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

以下是原始数据的外观:

$data = array(
 0 => array('John','Doe','johndoe@gmail.com'),
 1 => array('Foo','Bar','foobar@gmail.com')
);
$columns = array('firstname','lastname','emailaddress')
下面是我从步骤2中选择的专栏:

$data = array(
 0 => array('John','Doe','johndoe@gmail.com'),
 1 => array('Foo','Bar','foobar@gmail.com')
);
$columns = array('firstname','lastname','emailaddress')
如何创建如下所示的sql查询:

在联系人(id、firstname、lastname、emailaddress)中插入值(null、'John'、'Doe'、'johndoe@gmailcom)

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

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

编辑


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

要解析CSV文件中的数据,请查看fgetcsv

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

$data = array();
while (($lineFields = fgetcsv($handle)) !== false) {
    $data[] = $lineFields;
}
这假设您使用的是PHP5,并使用$handle打开了文件。在PHP4中,fgetcsv需要第二个参数来表示要读取的最大行长度

对于查询:

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

我没有在值后面加任何东西。您应该创建准备好的语句来防止sql注入。另外,如果您使用的是MySQL,则id应该是一个自动递增字段,并从插入中省略(让MySQL生成它)。如果您使用的是Postgres,则需要为id字段创建一个序列。无论如何,让数据库为您生成id。

要解析CSV文件中的数据,请查看fgetcsv

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

$data = array();
while (($lineFields = fgetcsv($handle)) !== false) {
    $data[] = $lineFields;
}
这假设您使用的是PHP5,并使用$handle打开了文件。在PHP4中,fgetcsv需要第二个参数来表示要读取的最大行长度

对于查询:

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

我没有在值后面加任何东西。您应该创建准备好的语句来防止sql注入。另外,如果您使用的是MySQL,则id应该是一个自动递增字段,并从插入中省略(让MySQL生成它)。如果您使用的是Postgres,则需要为id字段创建一个序列。无论如何,让数据库为您生成id。

我没有提到您的第二个问题,但您的解决方案是我会选择的。伪代码:如果numFieldsCurrLine>maxFieldsSeen,则maxFieldsSeen=numFieldsCurrLine;我没有提到你的第二个问题,但你的解决方案是我赞同的。伪代码:如果numFieldsCurrLine>maxFieldsSeen,则maxFieldsSeen=numFieldsCurrLine;谢谢你的回答和评论。这正是我想要的。谢谢你的回答和评论。这正是我要找的。