mysql — автоматическое генерирование токена не работает должным образом в переполнении стека

Я сейчас создаю проект. В этом я застрял. Я хочу, чтобы генерировался 8-значный пин-код. Если этот контакт уже находится в базе данных, генерируется другой номер. После подсчета 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;
}

Мой код не работает должным образом. пожалуйста, помогите мне

0

Решение

Ваш код не будет увеличивать счетчик, потому что вы этого не сделали.

Я создал пример на основе вашего кода, я использовал рекурсию для получения токена.

Создать функцию токена:

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)) означает, что нет возможности дублировать токен.
  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);
}
2

Другие решения

Других решений пока нет …