2012-08-03 84 views
1

我試圖將CSV導入到MySQL數據庫中,其中每個新行應代表數據庫中的新行。PHP CSV上傳腳本,使用新行?

這裏是我迄今爲止在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)做一些「哈克」的循環,可以記憶索引的位置,那麼n在每個插入確實+ 1數組值。

2)意識到fgetcsv不是我需要的函數,並且有更好的方法來處理新行!

謝謝!

回答

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);或其他內容。底線是:我並不完全確定,但注射的風險應該總體而言很小。

多一點,可以發現here

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

+0

謝謝,這將工作與臨時文件,就像我的例子,或有文件被保存?另外,這將如何處理注入和不好的字符,如「? – 2012-08-03 11:43:21

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

您也不妨設置auto_detect_line_endings爲true在php.ini中,以避免問題與Mac創建的CSV。