0

磷酸盐

// $numberOption = the number of fields in TableA.
// $csvHeaders   = a single dimention array with all the names of the fields in a CSV file.
// $tableHeaders   = a single dimention array with all the names of the fields in TableA.

for ($a=0; $a < $numberOption; $a++) {
            if ($a == 0) {
                $toVars .= "@var$a";
                $setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];
            } else {
                $toVars .= ", @var$a";
                $setCols .= ", " . $tableHeaders[$a] . " = @var" . $csvHeaders[$a];
            }
        }

        $sql    = "LOAD DATA LOCAL INFILE '".addslashes($current_file)."' REPLACE INTO TABLE $current_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '" . '"' . "' ESCAPED BY " . "'\\\\'" . " LINES TERMINATED BY '\n' IGNORE 1 LINES ($toVars) SET $setCols";

$sql 的返回值

"LOAD DATA LOCAL INFILE '\/var\/www\/html\/test_lms\/include\/files\/1349237011-2fb46cd0c360464ebf471755cc9580de-AUTO_INSURANCE.csv' REPLACE INTO TABLE auto FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\n' IGNORE 1 LINES (@var0, @var1, @var2, @var3, @var4, @var5, @var6, @var7, @var8, @var9, @var10, @var11, @var12, @var13, @var14, @var15, @var16, @var17, @var18, @var19, @var20, @var21, @var22, @var23, @var24, @var25, @var26, @var27, @var28, @var29) SET callcenter = @var, agent = @varEMPTY, generation_date = @varEMPTY, first_name = @varEMPTY, last_name = @varEMPTY, email = @var3, phone = @var4, address = @var5, city = @var6, state = @var7, dob = @varEMPTY, gender = @varEMPTY, marital_status = @varEMPTY, rented = @varEMPTY, year = @varEMPTY, make = @varEMPTY, model = @varEMPTY, trim = @varEMPTY, vin = @varEMPTY, primary_use = @varEMPTY, miles_oneway = @varEMPTY, mileage = @varEMPTY, license_num = @varEMPTY, license_state = @varEMPTY, education = @varEMPTY, job_title = @varEMPTY, vendors = @var9, license_status = @varEMPTY, zip = @var8, dupe = @varEMPTY

好的,在 php 行中清楚地表明$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];它正在$setCols使用字段名称初始化tableA,然后是等号,然后是这个东西@var(我猜是 mysql 变量?),然后是 csv 字段名称。但结果显示@var符号上附加了一个数字,而不是 csv 字段名称!有些@varEMPTY附加到它们,这仅意味着$csvHeaders数组中没有要使用的字段名称,因此EMPTY返回了。

无论如何,它有效。实际上,我能够很好地完美地加载 csv 文件。但我不明白它是如何能够SET@var#而不是@varCSVNAME。另一个问题是为什么要使用@var?不会IGNORE LINES 1 (table field names) SET (csv header names)工作得很好吗?为什么是@var的?

4

2 回答 2

1

LOAD DATA INFILE您的声明中使用的格式是

LOAD DATA LOCAL INFILE 'file.txt'
  REPLACE INTO TABLE t1
  ...
  (@var0, @var1, ...)
  SET column0 = @var0,
  SET column1 = @var1,
  ...
  ;

这里@var0, @var1etc 是 mysql 用户变量,column0, column1etc 是 mysql 表列。csv 文件中的字段将按照 csv 文件中字段的顺序读入给定的 mysql 用户变量@var0, @var1, ...

我认为没有任何语法允许您将 csv 标头字段名称映射到表列。所以你将无法使用IGNORE LINES 1 (table field names) SET (csv header names).

您的脚本用于$numberOption创建许多用户变量,csv 文件中的字段将被读取到这些用户变量中。$csvHeaders存储 CSV 字段相对于相应表列的位置。因此$tableHeaders[6] = 'email';$csvHeaders[6] = 3;由于3rdcsv 文件的字段是email字段。在LOAD DAT INFILE语句中,csv 文件中的第三个字段将被读入用户变量@var3,然后SET email = @var3将使用此变量设置电子邮件列的值。由于没有读入任何内容@varEMPTY,因此使用它们设置的列将不会从文件中获取任何数据。类似地,读入变量@var29的数据(如未在任何变量中使用)set将被忽略。

LOAD DATA ... (COL3, COL1, @dummy, COL2, @dummy);或者,如果 csv 文件中的字段是;,您可以使用col3, col1, notInTable, col2, notInTable;。如果表中的列和 csv 文件中的字段在数量和顺序上不同,则可以使用它。

如果表中的列和 csv 文件中的字段在数量和顺序上匹配,那么LOAD DATA ... INTO TABLE t1;就足够了。

如果表中的列和 csv 文件中的字段在数量上匹配但顺序不同,则LOAD DATA ... INTO TABLE t1 (COL3, COL1, COL2);.

于 2012-10-03T06:59:31.400 回答
0

@符号仅用于 PHP 中的错误抑制。PHP中@符号的用途是什么?

var仅在清除类中的变量时使用。

在 PHP 中声明变量时,您不必事先声明变量(尽管如果您习惯于使用其他语言,这是一个很好的做法)。但是,您必须通过使用前缀来表示它是一个变量$,例如:$x = 0;

通过 mysql使用DATA LOCAL INFILE,您可以传递“虚拟”参数以确保它们已设置,即使它们不存在。

使用这条线:$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];对我来说似乎有点奇怪,因为它@var会被认为是一个常量varwhere@抑制了常量不存在的错误。

然后连接字符串的其余部分(在您的情况下$tableHeaders[$a]."= ".$csvHeaders[$a];)。

于 2012-10-03T04:51:59.077 回答