2

我的用户帐户表单的一部分询问人们他们的兴趣($tags),这些兴趣存储在 MySQL 中,每个 $tag 用逗号分隔。

每个 $tag 都有一个 id,然后一个单独的表将用户的唯一 id 与 $tag id 链接起来。

这一切都很好 - 绝对理想但我不想重复标签数千次。例如,很多人会输入“gym”作为兴趣。继续添加一个具有唯一 id 的新“gym”$tag 似乎是一种浪费,而一旦将其作为 $tag 输入一次,该 $tag id 就可以与碰巧也输入 ' 的任何新用户 id 相关联健身房'。那有意义吗?

我当前的代码如下($tags 来自经过清理的 $_POST),并插入到两个表中:

1.tag_id 有一个 $tag 的标签字段,每个都生成一个唯一的 id 2.tag_relation 将用户 id 与生成的标签 id 匹配。

$tags = strtoupper($tags);$tags= preg_split('/\,/', $tags);
foreach ($tags as $ind) 

{
$sql = "INSERT INTO tag_id (tag) VALUES('$ind')";
$result=mysql_query($sql);
}

foreach ($tags as $ids) 
{
$sql = "SELECT * FROM tag_id WHERE tag = '$ids'";
$result=mysql_query($sql);
$idinfo=mysql_fetch_assoc($result);
$id=$idinfo['t_id'];

$sql = "INSERT INTO tag_relation (user_id, tag_id) VALUES ('$user_id', '$id')";
$result=mysql_query($sql);
}

所以我的问题是,是否可以将上述内容修改为不在 tag_id 表中重复 $tags,而是将该表中现有的 $tags 与 tag_relation 中的用户 ID 匹配?

4

1 回答 1

1

您应该在列上创建UNIQUE索引。tag然后,您可以使用INSERT IGNORE插入新标签,但如果重复键警告已存在于表中,则取消它。

CREATE UNIQUE INDEX idx_tag_unique ON tag_id (tag);

插入标签时:

INSERT IGNORE INTO tag_id (tag) VALUES ('$ind');

当然,在您这样做之前,您需要清除现有的重复标签值表。但是,如果值已经存在,则无法使用LAST_INSERT_ID()INSERT IGNORE因此,为了可靠地获得tag_id它,您需要像当前一样继续查询它。

顺便说一句 -$tags如果它们来自用户输入,我们假设标签值已经针对 SQL 注入进行了转义。如果没有,请务必mysql_real_escape_string()在循环中调用它们。并考虑迁移到比mysql_*()MySQLi 或 PDO 等支持参数化查询的函数更新的 API。

于 2012-10-25T20:39:00.640 回答