用MySQL替换用户名的最佳方式


Best way to REPLACE with MySQL for usernames

我正在用PHP开发一个网站,它现在有自己的状态和墙系统(分别类似于twitter和facebook)。我正在努力让用户稍后可以更改用户名,任何提及该用户的状态或墙帖(如"@woo-hi!")都将被新用户名取代。

我试过在MySQL中使用REPLACE查询,但很明显,我不能只用"newusername"替换"username",因为如果用户名为@w的人将用户名更改为@f,那么其他用户名为@woo的人的帐户将变成@foo。明白我的意思了吗?

我认为我的选择基本上是创建自己的格式来保存状态/墙帖子,将用户名@woo替换为|woo|(或任何表示用户名结尾的内容),但我很好奇是否有其他人对此有不同的想法,或者,如果有人知道让REPLACE查询为我做这件事(比如让它作为整个单词扫描的一种方式,这样@w!=@woo。我很想听听你的想法。

编辑:

我想好了我要做什么,正在更新这篇文章,供其他人将来参考。我决定用#@usernames#替换状态/墙帖子中的所有@usernames,并将它们保存在DB中。因此,现在我可以使用MySQL的简单REPLACE查询来替换状态/墙帖子中提到的所有用户名,并且不会出现歧义问题(在我的数据库中,@w变成了#@w#,这意味着将用户名@w(#@w#)更改为@f(#@f#)不会将#@woo#更改为#@foo#。当然,现在在帖子中显示用户名时,我必须通过一个"非格式化"函数来运行内容,在开始和结束处去掉#,但这还不错。

您可以设计数据库来存储关于每个状态/帖子的额外数据,例如,帖子中提到的用户的所有用户ID的列表。然后,很容易执行有针对性的搜索并替换为:

  • 查找所有提及用户通过加入其id更改姓名的帖子
  • 仅在这些帖子中将$oldname替换为$newname

您可能仍然有一小部分歧义(在一篇文章中多次提及),但您应该能够编写一个正则表达式来标识$oldname,而不是$oldname的子字符串