Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为MySQL唯一字段生成唯一值_Php_Mysql_Unique - Fatal编程技术网

Php 为MySQL唯一字段生成唯一值

Php 为MySQL唯一字段生成唯一值,php,mysql,unique,Php,Mysql,Unique,例如,当用户注册到我的网站时,我会创建一个长度为40的唯一字符串,并将其插入数据库。然后,我们向新注册的用户发送一封电子邮件,其中以URL的形式包含这个唯一的字符串,所有这些都可以正常工作。 但是如何创建和插入这个注册实体,以确保具有unique属性的字段实际上是唯一的 我目前的做法如下: $key = ''; $repeat = true; while ($repeat) { $key = generate_hash(40); $is_unique = (count($mode

例如,当用户注册到我的网站时,我会创建一个长度为40的唯一字符串,并将其插入数据库。然后,我们向新注册的用户发送一封电子邮件,其中以URL的形式包含这个唯一的字符串,所有这些都可以正常工作。 但是如何创建和插入这个注册实体,以确保具有unique属性的字段实际上是唯一的

我目前的做法如下:

$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