Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 加载本地填充中@var的上下文是什么_Php_Mysql_Sql_Variables - Fatal编程技术网

Php 加载本地填充中@var的上下文是什么

Php 加载本地填充中@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; $

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";

好的,在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,
  ...
  ;