检查用户是否激活了他/她的帐户的最有效方法?

时间:2010-08-03 15:20:59

标签: php mysql activation

我希望我的用户在他们能够登录之前激活他们的帐户。他们在注册后发送一封包含激活链接的电子邮件,如下所示:

http://www.blabla.com/activate.php?email=blabla@blabla.com&token=Aisd23uNMAu53932asdDasd82AS

当然,每当有人登录时,我都必须检查用户是否激活了他/她的帐户。我可以想到两种方法来解决这个问题,要么在我的'users'表中有一个额外的列,只要用户激活就会设置为空:

-----------------------------------------------
| id | username | password | activation_token |
-----------------------------------------------
| 1  | user1    | blabla   |                  |
-----------------------------------------------
| 2  | user1    | blabla   | asd232DA34qADJs2 |
-----------------------------------------------

然后,每当用户登录时,我都会提取activation_token和用户信息。或者我可以有一个仅包含激活令牌的单独表,然后每次用户登录时都会在'users'表中加入:< / p>

--------------------------------------
| id | account_id | activation_token |
--------------------------------------
| 1  | 37         | dsad2428491dka98 |
--------------------------------------
| 2  | 2          | asd232DA34qADJs2 |
--------------------------------------

哪一个效率最高?谢谢你的时间。

编辑:感谢所有精彩回复

8 个答案:

答案 0 :(得分:4)

就个人而言,我会把两者结合起来......

-------------------------------------
| id | username | password | status |
-------------------------------------
| 1  | user1    | blabla   | 1      |
-------------------------------------
| 2  | user1    | blabla   | 0      |
-------------------------------------

状态为TINYINT(1)字段,对于已停用的用户为0,对于已激活的用户为1。这样,您可以非常快速地告诉用户的“状态”......

然后,将令牌存储在另一个表中(就像您已经拥有的那样)......这样,您不需要加入,或者在不激活帐户时检查字符串列...

答案 1 :(得分:1)

使用第一个选项 - 将isactivated列添加到USERS表。

不需要单独的表 - 这是一对一的关系。

答案 2 :(得分:1)

将令牌存储在Users表而不是单独的表中意味着您不必在每次查询期间加入它们,这会稍快一些。

此外,您没有存储userIds并为该令牌表创建新的Id,这将节省数据存储。

答案 3 :(得分:1)

我有一个整数字段,Activated,默认为0.当有人尝试身份验证时,您只会查找已激活的帐户。我将auth令牌存储在您所描述的单独表中。

答案 4 :(得分:1)

如果关系是1-1(例如,激活表每个帐户ID将有1行),那么执行完全规范化的2表方法是一种过度杀伤力。

你不会遇到任何一种方法的主要问题,但是1-table one更容易。

如果使用2-table方法,则应在用户表中存储“激活”是/否标志,因此您无需加入第二个表以进行用户登录。

答案 5 :(得分:1)

如果激活令牌仅用于验证“点击此处激活您的帐户”链接并且永远不会再次使用,那么在您的用户表中浪费存储char(32)(或其他任何内容)的空间毫无意义它是一次性使用的字段。将激活令牌放在一个单独的表中,当用户点击激活时,您的帐户激活脚本可以参考该表。激活完成后,您可以从该单独的表中删除令牌的记录。

在登录过程中登录脚本可以检查的用户表中放置一个'is_activated'布尔/位字段(如果字段为null / false,则输出“嘿,你还没有激活”错误)。 / p>

当然,如今磁盘空间很便宜。即使是每个拥有32char激活令牌的百万用户也只会“浪费”32meg的空间。如果磁盘驱动器的价格低于100美元,则为磁盘的0.00305%,基本上为0.00美元(0.305美分)。

答案 6 :(得分:0)

我认为不需要在DB中存储激活令牌。像md5('users @ email'。'secret')之类的东西可以正常工作。至于用户状态,我同意其他人的意见,在users表中使用单独的专用“status”列。另一个优点是该列也可以存储其他stati(例如“禁止”;)

答案 7 :(得分:0)

在我看来,不是将激活码存储在用户表中,而是默认情况下将标志设置为关闭。当用户点击任何激活链接时,然后更新表并设置标志。

登录前检查标志是否开启。 如果标志已关闭,则用户未单击激活链接。然后你可以给用户一个错误信息。

如果启用了标记,则用户可以成功登录。