自动生成令牌在 php 中无法正常运行
Auto generate token does not functioning properly in php
我正在创建一个项目。在这一点上,我被困住了。我希望生成一个 8 位数的密码。如果此 pin 已经在数据库中,则会生成另一个 pin 编号。计数 100 次后,如果生成的密码在数据库中总共有 100 次,则生成一个 9 位密码。
我的代码如下:
$t=$this->generate_string(8);
$th= Booking::Where('token',$t)->first();
$count = 0 ;
if(isset($th)) {
if($count >= 100){
$t = $this->generate_string(9);
}else{
$t = $this->generate_string(8);
}
$count++;
}
$booking->token = $t;
和generate_string函数是
private function generate_string($length)
{
$character = '0123456789';
$character .= 'abcdefghijklmnopqrstuvwxyz';
$quantity_character = strlen($character);
$quantity_character--;
$Hash = NULL;
for ($x = 1; $x <= $length; $x++) {
$position = rand(0, $quantity_character);
$Hash .= substr($character, $position, 1);
}
return $Hash;
}
我的代码运行不正常。请帮助我
您的代码不会增加计数器,因为您没有这样做。
我根据您的代码创建了一个示例,我使用递归来获取令牌。
生成代币函数:
private function generate_string($length)
{
$character = '0123456789';
$character .= 'abcdefghijklmnopqrstuvwxyz';
$quantity_character = strlen($character);
$quantity_character--;
$Hash = NULL;
for ($x = 1; $x <= $length; $x++) {
$position = rand(0, $quantity_character);
$Hash .= substr($character, $position, 1);
}
return $Hash;
}
检查令牌功能:
private function check_token($t){
return Booking::Where('token',$t)->first();
}
获取代币功能:
private function get_token($length, $count){
$t=$this->generate_string($length);
$r = check_token($t);
if(!isset($r)) // base case 1
return $t;
if($count <= 0) // base case 2
return $this->generate_string(9);
return $this->get_token($length, --$count); // decrements the $count and do recursion.
}
用法:
$token = $this->get_token(9, 5); //token length = 9, max tries = 5
获取令牌函数使用递归生成令牌,递归如何停止?我们必须基于案例,
- 当
!isset(check_token($t))
表示不可能有重复的token。
- 当
$count <= 0
意味着我们达到了最大可能的尝试次数。
如果没有一个基本情况匹配,该函数会用递减的$count
再次调用它自己。
检查并更新它以满足您的需要。
更新:
要在令牌匹配 n
次时获取令牌,请按以下方式更新 get_token
函数:
private function get_token($length, $count){
$t=generate_string($length);
$r = check_token($t);
if(isset($r)){ // token matches, then decrements $count
--$count;
}else{
return $t; // token did not matched, then return the token
}
if($count <= 0) // if we reaches the max tries, return token of length '$length + 1'
return $this->generate_string($length + 1);
return $this->get_token($length, $count);
}
我正在创建一个项目。在这一点上,我被困住了。我希望生成一个 8 位数的密码。如果此 pin 已经在数据库中,则会生成另一个 pin 编号。计数 100 次后,如果生成的密码在数据库中总共有 100 次,则生成一个 9 位密码。 我的代码如下:
$t=$this->generate_string(8);
$th= Booking::Where('token',$t)->first();
$count = 0 ;
if(isset($th)) {
if($count >= 100){
$t = $this->generate_string(9);
}else{
$t = $this->generate_string(8);
}
$count++;
}
$booking->token = $t;
和generate_string函数是
private function generate_string($length)
{
$character = '0123456789';
$character .= 'abcdefghijklmnopqrstuvwxyz';
$quantity_character = strlen($character);
$quantity_character--;
$Hash = NULL;
for ($x = 1; $x <= $length; $x++) {
$position = rand(0, $quantity_character);
$Hash .= substr($character, $position, 1);
}
return $Hash;
}
我的代码运行不正常。请帮助我
您的代码不会增加计数器,因为您没有这样做。
我根据您的代码创建了一个示例,我使用递归来获取令牌。
生成代币函数:
private function generate_string($length)
{
$character = '0123456789';
$character .= 'abcdefghijklmnopqrstuvwxyz';
$quantity_character = strlen($character);
$quantity_character--;
$Hash = NULL;
for ($x = 1; $x <= $length; $x++) {
$position = rand(0, $quantity_character);
$Hash .= substr($character, $position, 1);
}
return $Hash;
}
检查令牌功能:
private function check_token($t){
return Booking::Where('token',$t)->first();
}
获取代币功能:
private function get_token($length, $count){
$t=$this->generate_string($length);
$r = check_token($t);
if(!isset($r)) // base case 1
return $t;
if($count <= 0) // base case 2
return $this->generate_string(9);
return $this->get_token($length, --$count); // decrements the $count and do recursion.
}
用法:
$token = $this->get_token(9, 5); //token length = 9, max tries = 5
获取令牌函数使用递归生成令牌,递归如何停止?我们必须基于案例,
- 当
!isset(check_token($t))
表示不可能有重复的token。 - 当
$count <= 0
意味着我们达到了最大可能的尝试次数。
如果没有一个基本情况匹配,该函数会用递减的$count
再次调用它自己。
检查并更新它以满足您的需要。
更新:
要在令牌匹配 n
次时获取令牌,请按以下方式更新 get_token
函数:
private function get_token($length, $count){
$t=generate_string($length);
$r = check_token($t);
if(isset($r)){ // token matches, then decrements $count
--$count;
}else{
return $t; // token did not matched, then return the token
}
if($count <= 0) // if we reaches the max tries, return token of length '$length + 1'
return $this->generate_string($length + 1);
return $this->get_token($length, $count);
}