我的用户帐户表单的一部分询问人们的兴趣($标签),这些内容存储在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匹配?
答案 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。