2012-03-18 75 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シャツ、古い、販売

タグ:シャツ、アパレル、到着タグ:シャツ、古い、到着する

私は可能であれば、重複するタグ名を使用して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」()内のタグは、とのitem_id =、最終的にはitems_tagsに、各タグ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 ...を使用して新しいタグをすべて挿入した後、挿入クエリで使用した時間より前に変更された特定のアイテムIDのタグを削除するだけです。おそらく、これをトランザクション内で行うべきでしょう。

+0

あるいは、 'REPLACE INTO'((item_id'、' tag')に一意のキーがあると仮定して)を使った変種です。 –

+0

非常に遅い返事をして申し訳ありません。私はあなたの解決策を開始する方法がわかりません。あなたは私にコードやそれをより良く説明するものを提供できますか?ありがとうございました。 – Ken

1

あなたは可能性だけ

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

あなたのループを実行する前に。

NB:私は、少なくとも、エスケープするか、ストアドプロシージャ(最良のケース)に切り替えて、SQL injectionのリスクからアプリケーションを保護することを検討します。

関連する問題