SQL插入中的不重复标记(有毒)

时间:2012-10-25 20:35:48

标签: php mysql sql

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

每个$ tag都有一个id,然后一个单独的表将用户唯一ID与$ tag id相关联。

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

我当前的代码如下(来自已清理的$ _POST的$ tags),并且对两个表不完整:

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表中重复$ tag,但是将该表中的现有$标记与tag_relation中的用户ID匹配?

1 个答案:

答案 0 :(得分: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_*()函数更新的API,例如支持参数化查询的MySQLi或PDO。