php - load local infile 中 @var 的上下文是什么

标签 php mysql sql variables

PhP

// $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]; 它正在使用 tableA 中的字段名称初始化 $setCols,然后是等号,然后是 @var (我猜这是一个 mysql 变量?),然后是一个 csv 字段名称。但结果显示 @var 符号附加了一个数字,而不是 csv 字段名称!一些 @var 附加了 EMPTY,这仅意味着 $csvHeaders 数组中没有可供使用的字段名称,因此 EMPTY 已返回。

无论如何,它有效。实际上,我能够很好地加载 csv 文件。但我不明白它如何能够使用 @var# 而不是 @varCSVNAME 进行SET。另一个问题是为什么要使用 @varIGNORE LINES 1(表字段名称)SET(csv 标题名称) 不能正常工作吗?为什么是@var

最佳答案

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

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

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

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

您的脚本使用 $numberOption创建那么多用户变量,csv 文件中的字段将被读入其中。 $csvHeaders存储 CSV 字段相对于相应表列的位置。所以$tableHeaders[6] = 'email';$csvHeaders[6] = 3;3rd csv 文件的字段是 email field 。在 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); .

关于php - load local infile 中 @var 的上下文是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12701829/

相关文章:

php - 如何使用变量从php mysql中的两个表中减去

php - 将 api 输出从对象更改为数组 laravel

MySQL:如何优化这个简单的 GROUP BY+ORDER BY 查询?

错误1093

c# - ASP MVC 中的原始 SQL 'Insert Into'

php - 使用 PHPStorm 的 phpcs 自定义规则集

javascript - 避免某个函数仅在 WooCommerce 购物车中单击按钮时运行一次

sql - 如何在字符串之间格式化和插入字符- Postgresql

php - 将两个数组组合成关联数组,问题

java - Facebook 应用程序 - 如何在用户的墙上帖子上发布动态内容