2010-01-01 66 views
1

我正在實施基於this建議的標籤雲系統。 (但是,我沒有使用外鍵)PHP標籤雲系統

我允許多達25個標籤。我的問題是,我如何處理項目的編輯?我有這樣的項目添加/編輯頁面:

標題: 說明: 標籤:(例如數據)的電腦,圖書,網絡,設計

如果別人在編輯一個項目的詳細信息,我需要刪除所有首先從Item2Tag表中添加標籤,然後添加新元素?例如,有人改變了數據這樣:

標籤(例如數據)的電腦,圖書,網絡,報紙

我是否需要刪除所有來自Item2Tag表標籤,然後添加這些元素?這似乎效率低下,但我可以找到更有效的方法。

另一個問題是用這種方法是,如果有人編輯描述但不更改標籤框,我仍然需要從Item2Tag表中刪除所有元素並添加相同的元素。

我不是一個有經驗的PHP編碼器,所以你可以提出一個更好的方法來處理這個問題嗎? (純PHP/MySQL的解決方案是優選的)

由於提前,

回答

0

您應該對Item2Tag表的主鍵,以便只是嘗試,並插入鏈接到新的標籤 - 這將然而,如果錯誤了item2tag鏈接已經存在。根據您使用的DBMS,有不同的處理方法。 MySQL提供的語法如下:

INSERT INTO table (a,b,c) VALUES (1,2,3) 
    ON DUPLICATE KEY UPDATE c=c+1; 

即相當於:

UPDATE table SET c=c+1 WHERE a=1; 

如果記錄已經存在。

對於第二個問題,如果項目的item_id沒有改變,那麼你不需要改變標籤。 Item2Tag表將一個項目鏈接到一個標籤,但是如果item_id保持不變,則不需要更改標籤。

+0

感謝答案,但它並沒有完全回答我的問題。如果我使用這個查詢,數據庫中會存在舊標籤。如果你看問題中的示例數據,我還需要從中刪除「設計」標籤。對於第二個問題,我無法驗證標籤框是否更改。我如何驗證它? (看來唯一的方法是在更新行和比較它們之前再次請求所有標籤,這似乎效率低下,我相信對於所有問題應該有更好的解決方案。) – deniz 2010-01-01 10:32:07

+0

好的我想我在那裏有點困惑! 您可以通過保持標籤與物品的散列來判斷標籤是否已更改,例如,md5(「computer」+「book」+「web」+「design」),然後只有在存儲的散列和新的標記集合的散列不同時才更新標記。這會阻止您在刪除它們並重新更新之前獲取所有標籤。 Jimmy Shelter的回答如下,使用delta是另一個好辦法。您可以通過現有標籤或散列通過獲取或發佈來保存您在處理更新時不得不查看它們。 – mdm 2010-01-02 17:25:39

0

在你的系統中,你已經知道當前標籤,所以你可以做的是做一個增量。

要使用自己的例子,這些都是起始標籤: 電腦,書籍,網絡,設計

而且有人更改這個太: 電腦,書籍,網絡,報紙

// Quick & dirty example (pseudo)code 
$current_tags = array('computer', 'book', 'web', 'design'); 
$new_tags = array('computer', 'book', 'web', 'newspaper'); 

foreach ($new_tags as $key => $new_tag) { 
    if (!in_array($new_tag, $current_tags) { 
    $tags_to_add[] = $new_tag; 
    } else { 
    // Delete item from $current_tags 
    } 
} 
// Now delete the items left in $current_tags 
// And then add the items in $tags_to_add 
+1

似乎有很長的路要重新實現PHP的array_diff():例如: – TML 2010-01-04 00:30:06

+3

$ current_tags = array('computer','book','web','design'); $ new_tags = array('computer','book','web','newspaper'); $ added = array_diff($ new_tags,$ current_tags); $ removed = array_diff($ current_tags,$ new_tags); 後續的SQL應該非常簡單。 – TML 2010-01-04 00:37:24

+0

Doh!你完全正確。 – 2010-01-04 07:38:46