Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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 正在寻求帮助以创建唯一ID并确保它不存在于数据库中_Php_Mysql_Function_Compare - Fatal编程技术网

Php 正在寻求帮助以创建唯一ID并确保它不存在于数据库中

Php 正在寻求帮助以创建唯一ID并确保它不存在于数据库中,php,mysql,function,compare,Php,Mysql,Function,Compare,我试图创建一个函数,在运行时创建数字ID,检查DB中是否存在该ID,然后创建另一个ID并再次检查,直到它具有唯一ID。我一直在研究如何使用函数在函数中循环 function createUniqueID() { function buildUnique() { $uniqueID = rand(100000000000,999999999999); return $uniqueID; } function compareWithDB($uniqueID) { $s =

我试图创建一个函数,在运行时创建数字ID,检查DB中是否存在该ID,然后创建另一个ID并再次检查,直到它具有唯一ID。我一直在研究如何使用函数在函数中循环

function createUniqueID() {

function buildUnique() {
    $uniqueID = rand(100000000000,999999999999);
    return $uniqueID;
}

function compareWithDB($uniqueID) {
    $s = "SELECT id FROM table WHERE id='{$uniqueID}'";
    $r = mysql_query($s);
    return $r;
}

function countDBRows($r) {
    if(mysql_num_rows($r) >0){
        $f = false; // found   
    } else{
        $f = true;
    }
}

$uniqueID = buildUnique();
$r = compareWithDB($uniqueID);
$f = countDBRows($r);

if (!$f) {
    $uniqueID = 'nope';
}

return $uniqueID;

}

最好调用MySQL函数,并存储并返回该函数的值,除非该值必须是数字

SELECT UUID();

我建议您使用更简单、更有效的uniqid函数,它将为您实现这一点。它根据时间戳(以毫秒为单位)生成有保证的唯一ID。生成的Id为13位,除非您决定添加前缀或使用额外的“熵”来增加唯一性

编辑:请注意,这是函数返回的数字和字母

编辑2: 这里使用的方法是如何嵌套循环

while (true) {
    $uniqueID = buildUnique();
    $r = compareWithDB($uniqueID)
    if (countDBRows($r)) { break; }
}

然后,您的唯一ID存储在$uniqueID中。但是我不鼓励这样做,因为它体积大,效率低。。。但你看

如果您想要一个唯一的号码,那么只需使用

如果你想要一个唯一的随机数,为什么?在ID列上创建一个唯一索引,并继续尝试,直到没有错误。这对于并发性更好:多个并发调用可以具有相同的编号并通过测试。更好的是,让DB引擎用RAND来完成它

还有另一种方法, 您可以将sha1函数与静态变量结合使用,如图所示:

function GetUniqueID() {
    static $salt=1;
    $id = sha1("somestring".(string)$salt);
    $salt++;
    return $id;
}

这里$salt作为一个静态值,在所有调用之间保留其值,递增确保唯一ID的哈希值为SHA1。为了更安全,还可以将somestring随机化。

我回答我自己的问题,因为我找到了一个创建可能永远不会重复的大数字的解决方案。我使用三个随机的两位数变量和三种不同的日期语法

把它们放在一起可以清楚地表明,它们永远不会重复,除非有人在同一年、同一周、同一分钟内以相同的秒数发帖,并且有3个不同的随机数都是相同的

我认为这种情况发生的可能性将是数百万,如果有数百万的帖子发生,那么我相信我将有更多的资源来解决这个问题

$rand1 = rand(10,99);
$rand2 = rand(10,99);
$rand3 = rand(10,99);
$date1 = date("s"); // seconds
$date2 = date("y"); // 2 digit year
$date3 = date("W"); // week number (out of 52)
$uniqueID = $date1.$rand1.$date2.$rand2.$date3.$rand3;
return $uniqueID;

确切地说,这种方式也不是原子式的。只要反复尝试并插入,只要错误是唯一的约束冲突,您最终会成功,并且这种方式是原子的。我创建的ID必须是数字,我不希望它自动递增以防止人们猜测新值。它也是URL的一部分。像自动递增数+时间戳这样的东西使用随机数实际上很有意义:它在插入时比在Oracle中使用自动递增计数器或序列或RDBMS提供的任何机制快得多。@fge:在某些情况下,但对于SQL Server/Sybase来说,它是聚集索引的毒药。不确定同一个问题是否会对InnoDB造成如此大的影响,但看起来确实如此,我正在创建的ID必须是数字,我不希望它自动递增以防止人们猜测新的值。这也将是URL的一部分,但这并不能解决我的问题。我需要10-12位数作为变量。UUID也会创建一个字符串字母。是的,当这个uniqid随机创建一个已经存在的数字时会发生什么?我不太可能同意,但仍有可能。