自动生成令牌在 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

获取令牌函数使用递归生成令牌,递归如何停止?我们必须基于案例,

  1. !isset(check_token($t))表示不可能有重复的token。
  2. $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);
}