我正在将CSV文件导入数据库,这是一个多步骤的过程。
以下是步骤:
John,Doe,jondoe@gmailcom
,则用户将从下拉框中选择firstname,以从与数据值Doe关联的下拉框中的数据值John,lastname关联,和来自与数据值johndoe@gmail.com 我的问题如下:
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文件时,我可以得到每个记录的计数,并且解析结束时的最高计数是我的计数。好像对吗?有什么问题吗?
答案 0 :(得分:1)
要解析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注入。此外,如果您使用MySQL,id应该是一个自动增量字段,并从插入中省略(让MySQL生成它)。如果您使用Postgres,则需要为id字段创建序列。在任何情况下,让数据库为您生成id。