2013-04-23 72 views
1

我的方法$csv->getContent();包含我的列名,'data'是我的單個行以導入到數據庫。下面的循環在將各種CSV導入數據庫時​​完美無缺地工作。但是,當我有一個在有HTML內容的CSV列時,很多行可以正常導入,但有一些不行,我得到了SQLSTATE[HY093]: "Invalid parameter number: number of bound variables does not match number of tokens"錯誤。php將CSV導入到CSV,其中包含HTML內容

從我的研究中,我發現按照我在下面顯示的方式執行操作應該可以正確地轉義字符以避免使用addslashes,但它似乎沒有什麼區別。唯一一次這樣做的工作是如果我addslashes(addslashes($values));但那種有點荒謬,它將我的內容留在數據庫與\\\之前適用的字符。

我錯過了一個步驟,或者我只是卡住了。我看到它的方式,我應該能夠「無懈可擊」我的內容,以便每次都能將其加入到我的數據庫中。

$this->db->exec("SET CHARACTER SET utf8");       
$this->db->beginTransaction(); 
$content = $csv->getContent(); 
foreach($content['data'] as $key => $value) { 

    $sql = "INSERT INTO `".$destination_table."` (`"; 
    $sql .= implode("`, `", $content['columns']); 
    $sql .= "`) VALUES ("; 
    $sql .= implode(", ", array_fill(0, count($content['columns']), "?")); 
    $sql .= ")"; 
    $statement = $this->db->prepare($sql); 
    $statement->execute($value); 

} 
$this->db->commit(); 
+0

試着看看這個帖子。 http://stackoverflow.com/questions/10170913/invalid-parameter-number-number-of-bound-variables-does-not-match-number-of-tok – 2013-04-23 02:35:36

+0

並在你的循環。它真的是'$ content ['columns']'或應該是'$ value ['columns']'? – 2013-04-23 02:37:21

+0

$ value [columns]不存在。 $ content是一個多維數組。對不起,但這些迴應並沒有解決我的問題。我對使用預處理語句執行這些行非常感興趣。謝謝 – 2013-04-23 02:46:14

回答

0

好吧,我已經找到了答案,我的問題。我建立了一個個人使用的小應用程序,用於保存我在線列出的拍賣內容。有些內容比較陳舊,並且包含格式錯誤的html,所以在解析csv並導入數據庫時​​,錯誤的html可能會使事情變得糟糕。然而,經過更多的研究和閱讀,PDO的「bindParam」,然後是「執行」方法允許毫無疑問地導入內容,無論html的形式有多糟糕。這裏是我如何組織我的測試查詢,然後繼續嘗試搞砸html到數據庫。

$sql = $objDb->prepare('UPDATE `autolist_html` SET `value` = :html WHERE entity = "'.$entity[1].'"'); 
$sql->bindValue(':html',$_POST[$entity[1].'_html'],PDO::PARAM_STR); 
$sql->execute();  
0

我不喜歡你的代碼。如果有成千上萬的數據,並且您循環每個數據然後插入數據庫會怎麼樣?有一個mysql查詢將csv文件導入數據庫表。

來源:how-to-import-csv-file-to-mysql-table

+0

有成千上萬的行,但仍然很快。有時我使用批量插入聲明,但對於這個特殊問題,我需要這樣做。 – 2013-04-23 02:28:55