Php 加载本地填充中@var的上下文是什么
PhPPhp 加载本地填充中@var的上下文是什么,php,mysql,sql,variables,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; $
// $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";
好的,在php行中清楚地显示,
$setCols.=$tableHeaders[$a]。“=@var”$csvHeaders[$a]
它正在初始化$setCols
,使用tableA
中的字段名,然后是等号,然后是这个@var
(我猜这是一个mysql变量?),然后是一个csv字段名。但是结果显示了附加到@var
符号的数字,而不是csv字段名!一些@var
附加了EMPTY
,这意味着$csvHeaders
数组中没有字段名可供使用,因此返回了EMPTY
不管怎样,它是有效的。我能够加载在一个csv文件只是罚款和完美的事实。但是我不明白它怎么能用
@var#
设置,而不是@varCSVNAME
。另一个问题是为什么要使用@var
?忽略第1行(表字段名)集合(csv标题名)
工作正常吗?为什么使用@var
符号?在PHP中,@
符号仅用于错误抑制
var
仅在清除类内的变量时使用
在PHP中声明变量时,您不必事先声明变量(尽管如果您习惯于使用其他语言,这是一种很好的做法)。但是,您必须使用前缀$
来表示它是一个变量,例如:$x=0代码>
通过mysql使用DATA LOCAL infle
,您可以传递“虚拟”参数,以确保设置了这些参数,即使它们不存在
使用此行:$setCols.=$tableHeaders[$a]。“=@var”$csvHeaders[$a]
对我来说似乎有点奇怪,因为@var
将被视为var
的一个常量,其中@
抑制了该常量不存在的错误
然后连接字符串的其余部分(在您的示例中,$tableHeaders[$a]。“=”$csvHeaders[$a];
)。加载数据填充语句中使用的格式为
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文件中的字段将按照csv文件中字段的顺序读入给定的mysql用户变量@var0,@var1,…
我认为没有任何语法允许您将csv头字段名称映射到表列。因此,您将无法使用忽略第1行(表字段名称)集(csv标题名称)
您的脚本使用$numberOption
创建许多用户变量,csv文件中的字段将被读入其中<代码>$csvHeaders
存储CSV字段相对于相应表格列的位置。所以$tableHeaders[6]=“email”
和$csvHeaders[6]=3代码>因为csv文件的3rd
字段是email
字段。在LOAD DAT infle
语句中,csv文件中的第三个字段将被读入用户变量@var3
,然后SET email=@var3
将使用此变量设置电子邮件列的值。由于未将任何内容读入@varEMPTY
,因此使用它们设置的列将不会从文件中获取任何数据。类似地,读入变量(如@var29
)中的数据(在任何集合中未使用)将被忽略
或者,您可以使用加载数据。。。(COL3,COL1,@dummy,COL2,@dummy)代码>,如果csv文件中的字段是col3、col1、notInTable、col2、notInTable
;。如果表格中的列和csv文件中的字段在数量和顺序上不同,则可以使用此选项
如果表中的列和csv文件中的字段在数量和顺序上匹配,则加载数据。。。进入表t1代码>就足够了
如果表中的列和csv文件中的字段在数量上匹配,但顺序不同,则加载数据。。。进入表t1(COL3、COL1、COL2)代码>所以。。如何使用@var#而不是@varCSVNAME进行设置?在您提供的代码中,我没有看到任何“@varCSVNAME”的实例。$setCols.=$tableHeaders[$a]。“=@var”$csvHeaders[$a]
@var与$csvHeaders有关。能否显示$csvHeaders
的内容,并返回给定的sql
。[,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“3”,“4”,“5”,“6”,“7”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“EMPTY”,“9”,“EMPTY”,“8”,“空”]
我认为它给出了CSV列相对于表列的位置。因此,$tableHeaders
中的第6个字段出现在CSV.yup的第3列中,这正是它所做的。我知道这一点,但我的印象是,load local Infle的工作方式是以特定的格式为它指定表字段名顺序,然后使用SET
为这些字段赋值,这些值的出现顺序与其各自字段名的出现顺序相同。
LOAD DATA LOCAL INFILE 'file.txt'
REPLACE INTO TABLE t1
...
(@var0, @var1, ...)
SET column0 = @var0,
SET column1 = @var1,
...
;