Я сейчас создаю проект. В этом я застрял. Я хочу, чтобы генерировался 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;
}
Мой код не работает должным образом. пожалуйста, помогите мне
Ваш код не будет увеличивать счетчик, потому что вы этого не сделали.
Я создал пример на основе вашего кода, я использовал рекурсию для получения токена.
Создать функцию токена:
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))
означает, что нет возможности дублировать токен. $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);
}
Других решений пока нет …