2012-07-19 54 views
2

有一個mysql數據庫名爲:example它有一個表名爲:products它有字段:products_modelproducts_image。模型領域是獨一無二的。從csv導入內容到mysql數據庫

現在我有一個名爲data.csv的csv文件。其中有兩列products_model和products_image。我使用下面的代碼。但它不會將數據導入數據庫。我的代碼有什麼問題?

$fp = fopen("data.csv","r"); 
$length = 4096; //have to be optional length 
$fildDelineate = ',' ;//or "|" declare what you need 
$dbhost="localhost"; 
$dbname="zencartone"; 
$dbuser="root"; 
$dbpass=""; 
$link = mysql_connect($dbhost,$dbuser,$dbpass); 
if (!$link) { 
    die('Could not connect: ' . mysql_error()); 
} 
mysql_select_db($dbname); 

$databasetable = 'products'; 

$counter = 1;//to omission first row if it is table headers 

while($line = fgetcsv($fp,$length,$fildDelineate)){ 
    foreach($line as $key=>$value){ 
     //for example insert in 3 column 
     $importSQL = "insert into $databasetable (products_model, products_image) values('$line[0]','$line[1]')"; 
     mysql_query($importSQL) or die(mysql_error()); 
    } 
    $counter++; 
} 
fclose($fp); 

data.csv:

有兩個列:

products_model products_image 
MG200MMS dress/201247561673.jpg 
MG400-32MB dress/2012471141673.jpg 
MSIMPRO dress/201247741673.jpg 
DVD-RPMK dress/2012471831673.jpg 
DVD-BLDRNDC dress/2012474221673.jpg 
DVD-MATR dress/201112132056773.jpg 
+0

你得到了什麼錯誤?出了什麼問題? – Fluffeh 2012-07-19 08:42:03

+0

當你不斷更新你的問題,改變每個答案的代碼時,很難回答。我強烈建議你將問題保留在開頭。你現在的代碼與問題提出時的情況是一樣的。 – 2012-07-19 09:00:50

回答

2

編輯:

使用下面的循環:

while($line = fgets($fp)) { 
    $lineArray = explode("\t", $line); // Use tab as delimiter. 
    $importSQL = "insert into $databasetable (products_model, products_image) values ('".$lineArray[0]."','".$lineArray[1]."')"; 
    mysql_query($importSQL) or die(mysql_error()); 
    $counter++; 
} 

SQL錯誤:

$importSQL = "insert into $databasetable values('$line[0]','$line[1]')"; 

你需要指定列名:

$importSQL = "insert into $databasetable (col1, col2) values('$line[0]','$line[1]')"; 

編輯:fgetcsv($fp,$length,$fildDelineate,'')

外殼參數是設置爲空字符串。你可以擺脫它,如果你身邊的值沒有外殼的CSV:

fgetcsv($fp,$length,$fildDelineate) 

否則,設置正確的機箱(雙引號或單引號)。

+0

我更新了新代碼,它仍然無法正常工作,謝謝 – down1234 2012-07-19 08:55:00

+0

Stegrex,如果我想用csv列數據更新表中的某些數據,我該怎麼辦?謝謝 – down1234 2012-07-19 09:37:25

+0

$ importSQL字符串在哪裏,你可以使用SQL查詢「update products set products_image ='」。$ lineArray [1]。「'where products_model ='」。 $ lineArray [0] 「'」。 – Stegrex 2012-07-19 15:40:15

3

您的問題是在循環:

while(!fopen($fp)){ 
    if(!$line = fgetcsv($fp,$length,$fildDelineate,'')&& $counter){ 
     continue; 
    } 
    foreach($line as $key=>$value){ 

不正確。您的文件已經打開(在第一行代碼中)。在循環中,您需要閱讀,而不是重新打開。你的循環應該是這樣的:

while($line = fgetcsv($fp, 0, "\t")){ 
    foreach($line as $key=>$value){ 
     ... 
    } 
} 

編輯:作爲您的文件似乎TSV(製表符分隔值),我更新了上面的代碼讀取數據時使用的標籤字符作爲分隔符。

+0

對不起,它顯示警告:fgetcsv()[function.fgetcsv]:外殼必須是字符 – down1234 2012-07-19 08:53:15

+0

@ down1234我剛剛從下一行復制您的代碼。我已經更新了我的答案。 – 2012-07-19 08:58:43

+0

對不起。當我運行代碼時,現在一切正常,但數據庫不能有csv數據。爲什麼?謝謝 – down1234 2012-07-19 09:05:32