Php 为MySQL唯一字段生成唯一值
例如,当用户注册到我的网站时,我会创建一个长度为40的唯一字符串,并将其插入数据库。然后,我们向新注册的用户发送一封电子邮件,其中以URL的形式包含这个唯一的字符串,所有这些都可以正常工作。 但是如何创建和插入这个注册实体,以确保具有unique属性的字段实际上是唯一的 我目前的做法如下:Php 为MySQL唯一字段生成唯一值,php,mysql,unique,Php,Mysql,Unique,例如,当用户注册到我的网站时,我会创建一个长度为40的唯一字符串,并将其插入数据库。然后,我们向新注册的用户发送一封电子邮件,其中以URL的形式包含这个唯一的字符串,所有这些都可以正常工作。 但是如何创建和插入这个注册实体,以确保具有unique属性的字段实际上是唯一的 我目前的做法如下: $key = ''; $repeat = true; while ($repeat) { $key = generate_hash(40); $is_unique = (count($mode
$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字段具有unique属性,我需要知道插入这些键时不会发生唯一的冲突。几乎每种语言都有内置的unique id函数。在php中
echo uniqid();
您可以使用此函数生成uniqueID
function keygen($length=10)
{
$key = '';
list($usec, $sec) = explode(' ', microtime());
mt_srand((float) $sec + ((float) $usec * 100000));
$inputs = array_merge(range('z','a'),range(0,9),range('A','Z'));
for($i=0; $i<$length; $i++)
{
$key .= $inputs{mt_rand(0,61)};
}
return $key;
}
echo keygen(10);
函数键根($length=10)
{
$key='';
列表($usec,$sec)=爆炸('',微时间());
mt_srand((浮动)$sec+((浮动)$usec*100000));
$inputs=数组合并(范围('z','a')、范围(0,9)、范围('a','z'));
对于($i=0;$i),可以生成256^40个不同的40个字符的字符串。
Sun将在生成两个相同的字符串之前爆炸。您可以使用md5(time())
作为唯一值。time
的md5
对于每个提交的用户都不相同
$time = time();
$md5 = md5($time);
只要md5()
仅包含32个字符串长度,就可以在md5()
之后添加一个唯一的单词
现在您有了40个唯一的字符串长度。最后您可以添加$unique
作为数据库中的唯一值好的,基本上有两种方法
让DB处理这个问题,并使用UUID()创建一个唯一标识符,您可以在电子邮件中使用该标识符
根据您的MySQL版本,您有一些选择:
A.使用MySQL 4.1及以上版本,您可以通过插入直接使用该功能:
INSERT INTO table_name
(unique_id, field1, field2)
VALUES
(UUID(), "smth", "smth")
B.使用MySQL 5.0可以创建触发器,并在插入时自动填充唯一字段:
CREATE TRIGGER
unique_id
BEFORE INSERT ON
table_name
FOR EACH ROW
SET NEW.unique_id = UUID()
您可以通过编程检查生成的id是否真的唯一。与您现在所做的相同,但您可以像这样重构代码:
$key = generate_hash(40);
while ( count($model->get_by_key($key)) ) {
$key = generate_hash(40);
}
//here you have an unique id in $key
看看这个字符串必须是(全局)唯一的吗?或者你想让现在的(非常)难以猜测吗?因为你提到了[新用户、注册、电子邮件]我的猜测是:后者。这些密钥应该是唯一的。注册用户单击其电子邮件中包含此密钥的链接,然后该密钥用于确定要解锁的用户帐户。这只是使用唯一密钥的一个示例,必须有更好的方法生成它们。在您描述的示例中,nonce没有全球独一无二-很难猜测。请通过以下链接确认您的电子邮件帐户:http://.....?userid=&nonce=
,就像借记卡和atm机一样:不仅有一张卡有特定的pin码,而且有特定的卡(id),这已经够难了猜猜对应的pin。好的,所以这里的密钥不需要是唯一的。在解锁用户帐户之前,我应该确保数据库中显示的nonce和userid匹配。这种方法肯定更好-谢谢!
$key = generate_hash(40);
while ( count($model->get_by_key($key)) ) {
$key = generate_hash(40);
}
//here you have an unique id in $key