负载本地infile中@var的上下文是什么

时间:2012-10-03 04:18:05

标签: php mysql sql variables

比索

// $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字段名称!有些@var附加了EMPTY,这意味着$csvHeaders数组中没有要使用的字段名称,因此返回了EMPTY

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

2 个答案:

答案 0 :(得分:1)

LOAD DATA INFILE声明中使用的格式为

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

此处@var0@var1等是mysql用户变量,column0column1等是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;因为csv文件的3rd字段是email字段。在LOAD DAT INFILE语句中,csv文件中的第三个字段将被读入用户变量@var3,然后SET email = @var3将使用此变量设置电子邮件列的值。由于没有任何内容被读入@varEMPTY,因此使用它们设置的列将不会从文件中获取任何数据。同样,读取到@var29等变量的数据将被忽略。

如果csv文件中的字段为set;,则可以使用LOAD DATA ... (COL3, COL1, @dummy, COL2, @dummy);。如果表中的列和csv文件中的字段的数量和顺序不同,则可以使用它。

如果表格中的列和csv文件中的字段在数量和顺序上匹配,那么col3, col1, notInTable, col2, notInTable就足够了。

如果表格中的列和csv文件中的字段数量匹配但顺序不同,则LOAD DATA ... INTO TABLE t1;

答案 1 :(得分:0)

@符号仅用于PHP中的错误抑制。 What is the use of the @ symbol in PHP?

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

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

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

使用此行:$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];对我来说似乎有点奇怪,因为@var将被视为var的常量,其中@会抑制常量不会出现的错误退出。

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