【问题标题】:How to generate random integer not present in SQL database?如何生成 SQL 数据库中不存在的随机整数?
【发布时间】:2015-07-11 10:20:52
【问题描述】:

目前正在开发一个允许存在多个具有相同用户名的用户的登录脚本。当前的计划是生成一个随机的“秘密”用户 ID 来代替实际的用户名。那么我将如何生成一个随机整数并检查是否已添加?

这是我对代码的尝试;但是它似乎不起作用,因为它似乎没有做任何事情。

$looptime = 100;

while ($looptime > 0) {
    $userid = rand(0, 999999999);
    $SQL = "SELECT * FROM Accounts WHERE username = '" . $userid . "'";
    $result_id = @mysql_query($SQL) or die("DATABASE ERROR!");
    $total = mysql_num_rows($result_id);

    if (!$total) {
        $looping = 0;
        //CREATE THE ACCOUNT
        mysql_query("INSERT INTO Accounts (id,username,password, email, money, activated) VALUES ('', '$username','$password', '$email', '0', '1')") or die("REGISTER ERROR!"); //1=account activated

        //CONNECTED
        echo "IMCONNECTED";
    }
    $looptime--;
}

编辑:代码/号码应该很容易记住/记在某处,因为用户将能够查看和/或记下它以进行帐户恢复。

【问题讨论】:

标签: php sql random


【解决方案1】:

我建议要么使用 UUID/GUID(不是整数)来最大程度地减少冲突的可能性,要么使用标识列(不是随机的)来保证唯一性。它必须是整数吗?必须是随机的吗?

【讨论】:

  • 这意味着如果用户记得他们的密钥,他们就有办法检索帐户,因此最好有一系列他们可以很容易记住的数字。话虽如此,什么是 UUID/GUID?一般来说,我对 php/SQL 还是很陌生。
  • 通常在这种情况下使用 UUID/GUID。您经常会看到在请求中传递此类标识符的用于重置密码的电子邮件链接。这样用户就不需要输入任何内容...
  • UUID 和 GUID 似乎不适合我的目的,因为我只想要用户在丢失帐户时可以记下的代码。
【解决方案2】:

这是您可以做到的一种方法。在您的数据库中创建一个标量变量函数(类似于下面):

CREATE FUNCTION [dbo].[fn_randomNumber] (@guid nvarchar(128)) 
RETURNS int  AS  
BEGIN       
    SET @guid = REPLACE(@guid, '-', '');
    DECLARE @idInt varchar(Max) = '';

    DECLARE @i INT = 0;
    DECLARE @char VARCHAR;

    WHILE(@i < LEN(@guid))
    BEGIN
        SET @char = (SUBSTRING(@guid, @i, 1));

        IF(ISNUMERIC(@char) = 1)
        BEGIN
            SET @idInt = @idInt + @char;

            IF(LEN(@idInt) = 9)
            BEGIN
                BREAK;
            END
        END

        SET @i = @i + 1;
    END

    RETURN CAST(@idInt as INT);
END
GO

然后执行这个脚本:

SELECT [dbo].[fn_randomNumber] (
   newid())

当然,您需要评估结果以确保它不存在。

【讨论】:

    【解决方案3】:

    您是否使用整数作为表中的 ID?您可以将此 ID 附加到用户名。例如:我的用户名 1234、我的用户名 1245。

    【讨论】:

    • 不,在恢复用户数据时,我只想要一个整数作为某种秘密密码。
    • 那么用户名就是你表中的标识列?
    • 尽可能随机生成的ID作为身份。
    • 好的,所以你真正想要的是表中的identity column,通常这是一个整数,或者可能是一个 GUID/UUID。在整数的情况下,它不是随机的,但通常从 1 开始计数。这将允许您使用相同的用户名插入多行,这将允许您做您想做的事情,即我最初建议的事情。
    猜你喜欢
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2019-01-14
    • 2020-08-06
    相关资源
    最近更新 更多