[英]PHP CSV upload script, working with new lines?
我正在嘗試將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]))
問題是只插入了前四個值,顯然是由於缺少循環。
我可以想到兩個選項來解決這個問題:
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.