我现在正在创建一个应用程序,该应用程序需要为用户提供一个唯一的8位代码(仅数字),用户可以输入该代码来访问我的网站的受限部分,将其视为基本的身份验证,即输入密码,密码与用户匹配,则返回用户。我遇到的麻烦是创建一个唯一的8位代码。我知道PHP具有uniqid()
,但是返回的字符串太长。
我曾考虑过创建time()
和用户IP地址的哈希,但是laravel的Hash::create
返回整数和字符。
有人可以指出创建随机8位代码的方向吗?我也尝试过mt_rand
,但是很可能会产生匹配的数字,除非我当然在保存之前检查数据库中的代码并重新生成(如果存在)?
答案 0 :(得分:1)
这是我的生成随机数的代码:
public function generateRandomNumber($length = 8)
{
$random = "";
srand((double) microtime() * 1000000);
$data = "123456123456789071234567890890";
// $data .= "aBCdefghijklmn123opq45rs67tuv89wxyz"; // if you need alphabatic also
for ($i = 0; $i < $length; $i++) {
$random .= substr($data, (rand() % (strlen($data))), 1);
}
return $random;
}
答案 1 :(得分:0)
您需要检入数据库是否存在该号码
$randnum = rand(11111111,99999999);
这将生成一个随机的8位数字
答案 2 :(得分:0)
尝试使用此功能对于 Laravel ,它还将返回8位数字,并且在db中具有唯一校验。
在控制器功能中
$expense_id = Expense::get_random_string();
模式
public static function get_random_string()
{
if (function_exists('com_create_guid') === true)
{
return trim(com_create_guid(), '{}');
}
$random_unique = sprintf('%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));
$expense = Expense::where('expense_id', '=', $random_unique)->first();
if ($expense != null) {
$random_unique = $this->get_random_string();
}
return $random_unique;
}
答案 3 :(得分:0)
我的建议是做一个do-while循环,这种情况下,如果随机字符串已经存在,它将生成一个新的字符串。生成所需的代码,但Laravel实际上有一个助手(str_random()
)来处理此代码。
/**
* Create a unique code
*
* @return string;
*/
if ( ! function_exists('generateUniqueCode')) {
function generateUniqueCode()
{
do {
$unique_code = str_random(12);
} while (\App\User::where('code', $unique_code)->count() > 0);
return $unique_code;
}
}
答案 4 :(得分:0)
rand(10000000, 99999999);
您有1/89999999个机会落在同一数字上,因此可以检查它是否已被使用;)