2012-08-14 89 views
0

我最近問過如何將CSV插入MySQL數據庫。有人建議我使用LOAD DATA LOCAL INFILE,但事實證明,這是在我的主機上禁用,所以不再是一個選項。回到PHP循環..CSV PDO插入循環?

我有一個問題循環通過臨時上傳的結果,因爲我將值映射到插入數組。因此,在多行上,這將導致輸入兩次相同的條目(第一行的值),因爲數組值是明確定義的。

它插入1,2,3,4,然後是1,2,3,4。我想插入1,2,3,4然後插入數組5,6,7,8。

什麼解決方案(除了hacky for和row ++)?

在此先感謝。

$handle = fopen($_FILES['csv']['tmp_name'], "r"); 
$sql = "INSERT INTO tbl (col1, col2, col3, col4) VALUES (?, ?, ?, ?)"; 

while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
$query = $db->prepare($sql); 
if ($query->execute(array($data[0],$data[1],$data[2],$data[3]))) return true; 
    else return false; 
} 
+0

這個循環如何運行多次?你在那裏有一個return語句。 – 2012-08-14 16:08:39

回答

0

首先,你只需要一次準備查詢(這是使用預處理語句的兩個主要優點之一,注射預防是另一種),所以while之前把呼叫prepare()循環,不在裏面。

除此之外,我發現沒有理由說明您發佈的代碼會按照您聲稱的方式行事,除非您的數據在CSV文件中重複。

1

我能想到的唯一的事情是你的循環只執行一次,但是你運行循環兩次。 (您的循環中的「回報」的聲明。)

下面應該工作:

function loadCsv($db, $filename){ 

    $fp = fopen($filename, 'rb'); 
    $sql = 'INSERT INTO tbl (col1, col2, col3, col4) VALUES (?,?,?,?)'; 
    $pstmt = $db->prepare($sql); 

    while (FALSE !== ($data = fgetcsv($fp, 1000))) { 
     $cols = array_slice($data, 0, 4); 
     $query->execute($cols); 
    } 

    $pstmt->closeCursor(); 
    fclose($fp); 
} 

爲了獲得最大的兼容性和性能,我建議用連接像this connect_PDO function函數生成PDO。

0

問題出在return語句。刪除回報立即解決問題。

不幸的是發佈此答案的用戶已將其刪除。

感謝大家的建議和幫助!