Php SQL插入中的标记不重复(Toxi)

Php SQL插入中的标记不重复(Toxi),php,mysql,sql,Php,Mysql,Sql,我的用户帐户表单的一部分要求人们提供他们的兴趣($tags),这些兴趣($tags)存储在MySQL中,每个$tag用逗号分隔 每个$tag都有一个id,然后一个单独的表将用户的唯一id与$tag id链接起来 这一切都很好-绝对理想,但我不想重复标签数千次。例如,许多人会将“健身房”作为一种兴趣。继续添加具有唯一id的新“gym”$tag似乎是一种浪费,而一旦将其作为$tag输入一次,该$tag id就可以与碰巧也输入了“gym”的任何新用户id相关联。这有意义吗 我当前的代码如下($tags

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

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

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

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

1.tag_id,它有一个$tag的tag字段,每个字段生成一个唯一的id 2.将用户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_关系中的用户id相匹配?

您应该在
tag
列上创建一个
唯一的
索引。然后,您可以使用插入新标记,但如果表中已存在重复键警告,则可以抑制该警告

CREATE UNIQUE INDEX idx_tag_unique ON tag_id (tag);
插入标记时:

INSERT IGNORE INTO tag_id (tag) VALUES ('$ind');
当然,在执行此操作之前,需要清除现有的重复标记值表。但是,如果值已经存在,则在使用
INSERT IGNORE
时不能使用
LAST\u INSERT\u ID()。因此,要可靠地获取标签id,您需要像当前一样继续查询它


顺便说一下-我们假设
$tags
中的标记值已经针对SQL注入进行了转义,如果它们来自用户输入。如果没有,请确保在循环中对它们调用
mysql\u real\u escape\u string()
。并考虑迁移到一个新的API,而不是<代码> MySqL**()>代码>函数,如支持参数化查询的MyQuLi或PDO。

米迦勒-工作得非常完美,谢谢:我不能在五分钟内标记它的答案,但我会。再次感谢Michael的回答。除了Michael的回答之外,我建议您使用INSERT IGNORE to tag_relation(用户id,tag_id)从tag_id中选择“$userId”,t_id,其中tag=”$ind'Michael,$tags已清理。瓦迪姆,我去看看。谢谢两位:)