PHP标签云系统

PHP标签云系统,php,mysql,tags,Php,Mysql,Tags,我正在实施一个基于推荐的标签云系统。(但是,我没有使用外键) 我允许多达25个标签。我的问题是,我如何处理对项目的编辑?我有此项目添加/编辑页面: 标题: 说明: 标签:(示例数据)计算机、书籍、web、设计 如果有人编辑项目详细信息,我是否需要先删除Item2Tag表中的所有标记,然后添加新元素?例如,有人将数据更改为: 标签:(示例数据)计算机、书籍、网络、报纸 // Quick & dirty example (pseudo)code $current_tags = array('

我正在实施一个基于推荐的标签云系统。(但是,我没有使用外键)

我允许多达25个标签。我的问题是,我如何处理对项目的编辑?我有此项目添加/编辑页面:

标题: 说明: 标签:(示例数据)计算机、书籍、web、设计

如果有人编辑项目详细信息,我是否需要先删除Item2Tag表中的所有标记,然后添加新元素?例如,有人将数据更改为:

标签:(示例数据)计算机、书籍、网络、报纸

// 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
我是否需要从Item2Tag表中删除所有标记,然后添加这些元素?这似乎效率不高,但我可以找到一个更有效的方法

这种方法的另一个问题是,如果有人编辑了描述但没有更改标记框,我仍然需要从Item2Tag表中删除所有元素并添加相同的元素

我不是一个有经验的PHP程序员,所以你能建议一个更好的方法来处理这个问题吗?(最好是纯PHP/MySQL解决方案)


提前感谢,

您应该在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表将项目链接到标记,但如果项目id保持不变,则无需更改标记。

在您的系统中,您已经知道当前标记,因此可以做的是生成增量

使用您自己的示例,以下是起始标记: 计算机、书籍、网络、设计

有人也改变了这一点: 计算机、书籍、网络、报纸

// 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

谢谢你的回答,但是它并没有完全回答我的问题。如果使用此查询,数据库中将有旧标记。如果您查看问题中的示例数据,我还需要从中删除“design”标记。对于第二个问题,我无法验证标记框是否已更改。我如何验证它?(似乎唯一的方法是在更新行之前再次请求所有标记并比较它们,这似乎效率低下。我认为应该有一个更好的解决方案来解决所有问题。)啊,好吧,我想我有点困惑了!您可以通过对项目保留标记哈希来判断标记是否已更改,例如md5(“计算机”+“书籍”+“web”+“设计”),然后仅在存储的哈希与新标记集的哈希不同时更新标记。这使您不必在删除所有标记并再次更新之前获取所有标记。Jimmy Hurder下面的答案是使用三角洲是另一种很好的方法。您可以通过get或post传递现有标记或散列,以避免在处理更新时查找它们。重新实现PHP的array_diff():)似乎还有很长的路要走,例如:$current_tags=array('computer','book','web','design')$新标签=数组('computer'、'book'、'web'、'paper')$添加=数组差异($new\u tags,$current\u tags)$删除=阵列差异($current\u tags,$new\u tags);随后的SQL应该非常简单。