PHP CSV导入问题
我正在将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中,我将拥有用户选择的列
- 步骤1:用户上载CSV文件
- 步骤2:用户将数据与数据类型关联。例如,如果CSV中的记录包含以下数据:
,用户将从下拉框中选择firstname与数据值John关联,从与数据值Doe关联的下拉框中选择lastname,以及与数据值关联的下拉框中的emailaddressjohndoe@gmail.comJohn,Doe,jondoe@gmailcom
- 步骤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;谢谢你的回答和评论。这正是我想要的。谢谢你的回答和评论。这正是我要找的。