1

CSVをMySQLデータベースにインポートしようとしています。ここで、新しい行はそれぞれデータベースの新しい行を表す必要があります。

これが私がCSVでこれまでに持っているものです:

1one, 1two, 1three, 1four
2one, 2two, 2three, 2four

そして、アプリケーションでは:

$handle = fopen($_FILES['filename']['tmp_name'], "r");
$data = fgetcsv($handle, 1000, ",");

$sql = "INSERT INTO tbl (col1, col2, col3, col4) VALUES (?, ?, ?, ?)";
$q = $c->prepare($sql);

$q->execute(array($data[0],$data[1],$data[2],$data[3]))

問題は、明らかにループがないために、最初の4つの値のみが挿入されていることです。

これを解決するための2つのオプションを考えることができます。

1)インデックスの位置を記憶し、挿入された各配列値に対してn + 1を実行する、「ハッキー」なforループを実行します。

2)fgetcsvは私が必要とする関数ではなく、新しい行を処理するためのより良いものがあることを認識してください。

ありがとう!

4

2 に答える 2

2
while ($data = fgetcsv($handle, 1000, ",")){
  //process each $data row
}

auto_detect_line_endingsMac で作成された CSV の問題を回避するために、php.ini で true に設定することもできます。

于 2012-08-03T11:24:34.483 に答える
1

なぜこれにスクリプトが必要なのですか? 1 つの簡単なクエリでこれを行うことができます。

LOAD DATA LOCAL INFILE '/data/path/to/file.csv' INTO your_db.and_table
FIELDS TERMINATED BY ', ' /* included the space here, bc there's one in your example*/
LINES TERMINATED BY '\n' /* or, on windows box, probably by '\r\n'*/
(`col1`, `col2`, `col3`, `col4`);

それだけです (この場合、mysql のマニュアルには、指定できるその他のオプションが用意されていますOPITIONALLY ENCLOSED BY。)


わかりました、インジェクションに関する限り: 挿入中は - 私の知る限りでは - 問題になることはありません。データはクエリの作成に使用されることはありません。MySQL はそれを varchar データとして解析し、データを挿入するだけです (実行はしません)。それが受ける唯一の操作は、キャスト、必要であることが判明した場合に int または float への型キャストです。

テーブルからデータを選択し始めるときに害を及ぼす可能性のあるクエリ文字列がデータに含まれている可能性があります。このセッションで特定の文字をエスケープするように MySQL サーバーを設定したりstr_replace('``','``',$allData);、スクリプトで a または何かを実行したりすることができる場合があります。
結論は、完全にはわかりませんが、注射のリスクは全体的にかなり小さいはずです.

もう少しここで見つけることができます

一時ファイルに関しては、$_FILES['filename']['tmp_name']を使用しているため、独自の一時ファイルを使用することをお勧めします:file_put_contents('myLoadFile.csv',file_get_contents($_FILES['filename']['tmp_name']));完了したら、そのファイルを削除します。一時ファイルを直接使用することは可能かもしれませんが、私はそれを試していないのでわかりません (今日は試しません:-P)。

于 2012-08-03T11:36:34.287 に答える