【发布时间】:2015-02-03 09:34:13
【问题描述】:
例如,当用户注册我的网站时,我会创建一个长度为 40 的唯一字符串并将其插入数据库。然后,我们以 URL 的形式向新注册的用户发送包含此唯一字符串的电子邮件,这一切正常。 但是您如何创建和插入此注册实体以确保具有唯一属性的字段实际上是唯一的?
我目前的做法如下:
$key = '';
$repeat = true;
while ($repeat) {
$key = generate_hash(40);
$is_unique = (count($model->get_by_key($key)) === 0) ? true : false;
$repeat = ($is_unique) ? false : true;
}
// At this point I know the key is unique and can insert it...
我对这段代码不满意,因为我通常会尽量避免 while 循环。有没有更好的方法来实现我在这里所做的事情?
底线是包含这些键的 MySQL 字段具有唯一属性,我需要知道插入这些键时不会发生唯一冲突。
【问题讨论】:
-
看看
UUID() -
这个字符串必须(全局)唯一吗?还是您希望随机数(非常)难以被猜到?既然你提到了[新用户,注册,电子邮件],我的猜测是:后者。
-
这些键应该是唯一的。注册用户单击其电子邮件中包含此密钥的链接,该密钥用于确定要解锁哪个用户帐户。这只是使用唯一键的一个例子,必须有更好的方法来生成它们
-
在您描述的示例中,nonce 不必是全局唯一的 - 只是很难猜到。
please confirm your email account by following the link: http://.....?userid=<thisneedstobeunique>&nonce=<thisonlyhastobehardtoguess>,就像借记卡和自动取款机一样:不仅有一张卡有特定的密码,而且有一张特定的卡(id)很难(足够)猜出相应的密码。 -
好的,所以这里的键不需要是唯一的。在解锁用户帐户之前,我应该确保在数据库中呈现的随机数和用户 ID 匹配。这种方法肯定更好 - 谢谢!