2013-05-13 33 views
0

試圖拼湊fgetcsv問題和答案以獲取我需要的位置,但不掌握足以獲得所需結果的基礎知識。 的製表符分隔文件樣本....以製表符分隔的文件並根據匹配的行更新MySQL字段到唯一字段

╔══════════════╦════════════╦═══════╦══════════╗ 
║  sku  ║ asin ║ price ║ quantity ║ 
╠══════════════╬════════════╬═══════╬══════════╣ 
║ 00-1IAB-H5E9 ║ B008S0TEFQ ║ 5.00 ║  1 ║ 
║ 00-BOXP-HDX4 ║ B00BP9N4JO ║ 20.00 ║  1 ║ 
╚══════════════╩════════════╩═══════╩══════════╝ 

我需要更新一個新的數量在數據庫的基礎上,SKU。發現了很多類似的答案,但不完全是我需要的。價格和ASIN被忽略。這是我的代碼到目前爲止的相關部分。

$fin = fopen('qtyme.txt','r') or die('cant open file'); 
$link = mysql_connect('xxxx.com', 'xxxx', 'xxxx'); 
If (!$link) { 
    die ('Could not connect: ' . mysql_error()); 
} 
@mysql_select_db('xxxx') or die ('Unable to select database'); 
echo "Connection succeeded, starting processing..... <br />\n"; 
while (($data=fgetcsv($fin,r,"/t"))!==FALSE) { 
    $query = "UPDATE products SET products_quantity = '".$data[3]."' WHERE products_sku = '".$data[0]."'"; 
    mysql_query($query); 
    echo ($query) . "<br />\n"; 
    } 
fclose($fin); 
mysql_close(); 

很顯然,我不知道我在做什麼,但似乎我的問題是在定義列拉出正確的數據進行更新。

有幫助嗎?

FINAL解決方案:非常感謝您的幫助!

$link = mysql_connect('xxxx', 'xxxx', 'xxxx'); If (!$link) { 
    die ('Could not connect: ' . mysql_error()); } @mysql_select_db('xxxx') or die ('Unable to select database'); 

$sql = "TRUNCATE TABLE `tmpStock`"; mysql_query($sql); echo "Temporary Table Deleted...<br>"; 

$result = mysql_query("LOAD DATA LOCAL INFILE 'qtyme.txt' INTO TABLE tmpStock FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' LINES TERMINATED BY '\n'")or die ('Error: '.mysql_error()); echo "Temporary Data Uploaded and Inserted...<br>"; 

$result = mysql_query("UPDATE products a INNER JOIN tmpStock b ON a.products_sku = b.sku SET a.products_quantity = b.quantity")or die ('Error: '.mysql_error()); echo "All Quantity's Updated..."; 

mysql_close($link); 
+0

該問題似乎是fgetcsv。你有第二個參數r當它應該是最大行大小(或0默認它),而第三個參數有一個斜線用來表示一個製表符。 – Kickstart 2013-05-13 16:28:06

回答

0

我會很想創建一個臨時表,您的分隔文件加載到臨時表,然後做使用您現有的表和臨時表之間的連接更新一次。

像這樣的東西(未測試,所以請原諒任何錯字)

<?php 

$link = mysql_connect('localhost', 'root', ''); 
If (!$link) 
{ 
    die ('Could not connect: ' . mysql_error()); 
} 
@mysql_select_db('testarea') or die ('Unable to select database'); 

echo "Connection succeeded, starting processing..... <br />\n"; 

$result = mysql_query("CREATE TEMPORARY TABLE tmpStock 
(sku varchar(50), 
asin varchar(50), 
price double(16,2), 
quantity int(11), 
KEY sku (sku) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 "); 

$result = mysql_query("LOAD DATA INFILE 'C:/wamp/www/TestArea/qtyme.txt' INTO TABLE tmpStock FIELDS TERMINATED BY '\t' ENCLOSED BY '\"' LINES TERMINATED BY '\n'")or die ('Error: '.mysql_error()); 

$result = mysql_query("UPDATE products a INNER JOIN tmpStock b ON a.products_sku = b.sku SET a.products_quantity = b.quantity")or die ('Error: '.mysql_error()); 

?> 

PS - 可能使用mysqli,但我都堅持與MySQL,因爲這是你已經在使用。

+0

我知道我應該想出那些。輝煌的解決方案。由於安全限制,我不得不放棄臨時表,並在完成時截斷它並保留它,沒有什麼大不了的。由於服務器上的安全原因,還必須將LOCAL添加到LOAD DATA。 – northofnowhere 2013-05-13 16:50:32

+0

謝謝你解決主機服務器上一些小問題的最終代碼... – northofnowhere 2013-05-13 16:52:51

+0

很高興幫助。 – Kickstart 2013-05-13 20:27:52

相關問題