如何生成 SQL 数据库中不存在的随机整数?
How to generate random integer not present in SQL database?
目前正在开发允许多个用户使用相同用户名的登录脚本。目前的计划是生成一个随机的 "secret" 用户 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--;
}
编辑:code/number 应该很容易 remember/jot 记在某个地方,因为用户将能够查看它 and/or 记下它以用于帐户恢复目的。
我建议使用 UUID/GUID(不是整数)来最小化冲突的可能性,或者使用标识列(不是随机的)来保证唯一性。是否必须是整数,是否必须是随机的?
这里有一种方法可以做到。在你的数据库中创建一个标量变量函数(类似于下面):
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())
当然,您需要评估结果以确保它不存在。
您是否在 table 中使用整数作为 ID?您可以将此 ID 附加到用户名。例如:我的用户名1234、我的用户名1245。
目前正在开发允许多个用户使用相同用户名的登录脚本。目前的计划是生成一个随机的 "secret" 用户 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--;
}
编辑:code/number 应该很容易 remember/jot 记在某个地方,因为用户将能够查看它 and/or 记下它以用于帐户恢复目的。
我建议使用 UUID/GUID(不是整数)来最小化冲突的可能性,或者使用标识列(不是随机的)来保证唯一性。是否必须是整数,是否必须是随机的?
这里有一种方法可以做到。在你的数据库中创建一个标量变量函数(类似于下面):
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())
当然,您需要评估结果以确保它不存在。
您是否在 table 中使用整数作为 ID?您可以将此 ID 附加到用户名。例如:我的用户名1234、我的用户名1245。