2012-03-18 68 views
0

我正在爲我的網站設計一個標記系統(一個定製的博客)。這是我的源代碼開發標籤系統 - 如何用新標籤更新當前標籤?

<b>Please enter your tags, separating each one with a comma.<b><br> 
<input type="text" name="tags" size=50> 

$taginput = $_POST["tags"]; 
$tagarray = explode(",",$taginput); 
for($i=0;$i<count($tagarray);$i++){ 
$usetag = mysql_real_escape_string(stripslashes(ltrim(rtrim($tagarray[$i])))); 
if($usetag == "") continue; 
$query = "INSERT INTO tags (item_id,tag) VALUES ($itemid,'$usetag')"; 
mysql_query($query); 
} 

CREATE TABLE `tags` (
`uid` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 
`item_id` INT(11) NOT NULL, 
`tag` VARCHAR(50) NOT NULL 
) ENGINE = MYISAM ; 

哪裏item_id是博客文章ID和tag是標籤名稱

現在我正在尋找如何,如果我與標籤更新後的解決方案..我該怎麼刪除目前的標籤,並用新的標籤取代它?以及如何刪除一些特定的現有標籤並將其替換爲新的?

這樣,

標籤由標籤取代襯衫,服裝,進場T恤,舊,銷售

標籤:襯衫,服裝,進場標籤:襯衫,舊,來港定居人士

我的同類o如果可能的話,要防止使用重複標籤名稱過度填充tags tables。請幫助..

回答

1

爲了避免重複的代碼,你需要在其他許多表許多關係

create table `items_tags` (
    `item_id` int(10) unsigned not null default 0, 
    `tag_id` int(10) unsigned not null default 0, 
    primary key (`post_id`, `tag_id`), 
) 

create table `tags` (
    `id` int(10) unsigned not null auto_increment, 
    `tag` varchar(100) not null default '', 
    primary key (`id`), 
    unique key (`tag`) 
) 

PS - 一個unsigned int只有10字符長,而不是11

我不會式出所有的代碼給你,但是當表單被提交時,你在標籤表上輸入「INSERT IGNORE」,選擇ID的where標籤IN(),從items_tags中刪除where item_id =,最後插入到items_tags中每個標籤id的記錄當前物品ID。

我建議你開始學習pdo。它使事情變得更容易。你還應該有級聯刪除的外鍵約束,所以當一個項目或標籤被刪除時,它的items_tags表中的引用也被刪除。

檢索所有標籤爲一個帖子很簡單:

select i.*, t.* from items as i left join items_tags as it on (it.item_id = i.id) left join tags as t on (it.tag_id = t.id) where i.id = <current item id> 

希望有所幫助。

2

您可以在表中添加一個名爲modifiedOn的新列。然後,無論何時插入或更新該表中的一行,都應將modifiedOn列設置爲當前時間。

這將允許您使用INSERT ... ON DUPLICATE KEY UPDATE ...,然後在插入所有新標籤後,只需刪除在插入查詢中使用之前修改過的給定項目標識的標籤。您應該也可以在交易中執行此操作。

+0

或者,也可以使用'REPLACE INTO'(假設('item_id','tag')上的唯一鍵))的變體。 – 2012-03-18 17:40:54

+0

對不起,最近的回覆..我不知道如何開始你的解決方案..你能提供一個代碼或更好地解釋它的東西嗎?謝謝。 – Ken 2012-03-28 07:07:22

1

你可以只

DELETE FROM `tags` WHERE `item_id` = $itemid; 

您運行循環之前。

注:我會考慮逃避(至少)或切換到存儲過程(最好的情況),以確保您的應用程序免受SQL injection的風險。