簡體   English   中英

PHP CSV上傳腳本,使用新行?

[英]PHP CSV upload script, working with new lines?

我正在嘗試將CS​​V導入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]))

問題是只插入了前四個值,顯然是由於缺少循環。

我可以想到兩個選項來解決這個問題:

1)做一些“hacky”for循環,記住索引的位置,然后對每個插入的數組值進行n + 1。

2)意識到fgetcsv不是我需要的功能,並且有更好的處理新線路!

謝謝!

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

您可能還希望在php.ini中將auto_detect_line_endings設置為true,以避免Mac創建的CSV出現問題。

為什么你需要一個腳本呢? 您可以在一個簡單的查詢中執行此操作:

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); 或者你腳本中的東西。
底線是:我不完全確定,但總體而言,注射風險應該相當小。

這里可以找到更多

說到臨時文件,因為你正在使用$_FILES['filename']['tmp_name'] ,你可能想要使用你自己的臨時文件: file_put_contents('myLoadFile.csv',file_get_contents($_FILES['filename']['tmp_name'])); ,並在完成后刪除該文件。 很可能是直接使用tempfile,但我沒有嘗試過,所以我不知道(今天不打算嘗試:-P)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM