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

$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行で、からのフィールド名、次に等号、次にこのこと(mysql変数だと思いますか?)、そしてcsvフィールド名$setCols .= $tableHeaders[$a] . " = @var" . $csvHeaders[$a];で初期化していることを示しています。ただし、結果には、csvフィールド名ではなく、記号に付けられた番号が表示されます。いくつかはそれらにアタッチされており、それは単に使用する配列からのフィールド名がなかったことを意味するので、返されました。$setColstableA@var@var@varEMPTY$csvHeadersEMPTY

とにかく、それは動作します。私はcsvファイルをうまくそして完全に実際にロードすることができます。しかし、私はそれがどのようにできるのか、できないのか理解してSET@var#ません@varCSVNAME。もう1つの質問は、なぜ使用するのかということ@varです。うまくいきませんIGNORE LINES 1 (table field names) SET (csv header names)か?なぜ@var's?

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 テーブル列です。@var0, @var1, ...csv ファイルのフィールドは、csv ファイルのフィールドの順序で 指定された mysql ユーザー変数に読み込まれます。

csvヘッダーフィールド名をテーブル列にマップできる構文はないと思います。したがって、使用することはできませんIGNORE LINES 1 (table field names) SET (csv header names)

スクリプトは$numberOption、csv ファイルのフィールドが読み込まれる多数のユーザー変数を作成するために使用します。$csvHeaders対応するテーブル列に対する CSV フィールドの位置を格納します。したがって$tableHeaders[6] = 'email';、csvファイルの$csvHeaders[6] = 3;フィールドはフィールドです。このステートメントでは、csv ファイルの 3 番目のフィールドがユーザー変数に読み込まれ、この変数を使用してメール列の値が設定されます。には何も読み込まれていないため、それらで設定された列はファイルからデータを取得しません。同様に、どの変数にも使用されていない変数に読み込まれたデータは無視されます。3rdemailLOAD DAT INFILE@var3SET email = @var3@varEMPTY@var29set

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];ため、私には少し奇妙に思えます。@varvar@

これにより、残りの文字列が連結されます(あなたの場合は$tableHeaders[$a]."= ".$csvHeaders[$a];)。

于 2012-10-03T04:51:59.077 に答える