Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

icarof

Laço de repetição

Recommended Posts

Olá Amigos

tenho um sistema, e nele ao fazer o cadastro de cobranças, ele gera um código através de uma função, de depois  grava no banco.

só que, as vezes são geradas muitas cobranças ao mesmo tempo, tipo 40 a 50 por requisição, um laço cria todas e cada uma tem seu código especifico.

 

mas, como ja existe muitas e no banco o campo é marcado como único, as vezes aparecem erros, pois acontece de gerar um combinação que ja existe.

no momento, estou usando uma analise simples, gero o código, vejo se já existe, se existir e gera outro e grava, se não grava o que ja estava.

 

mas essa verificação so acontece uma, e se o outro código gerado na condição também já estiver no banco?

gostaria de saber se alguem sabe algum forma de usar um laço, para que se faça a veriricação até que gere um registro que não esteja no banco.

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma pergunta e consideração:

 

Se são novos registros e diferentes registros porque está acontecendo conflito de códigos?

 

Se você tem a necessidade de criar códigos sequenciais, sugiro que você crie uma tabela somente para estes codigos e deixe o ID como autoincrement e assim você evita esse conflito e deixa a engine do SQL preocupar-se em fazer essa verificação, ou seja, para que tentar reinventar a roda se ela já está ali a sua disposição?!

 

Se não for essa situação, recomendo que você utilize hash do tipo md5 ou sha1 para estes códigos, mas é preciso atentar-se para que o código "hasheado" não tenha a mesma origem porque assim você vai seguir com o problema de conflito. Uma sugestão? No hash inclua a hora, minutos, segundos e milesimos na composição do hash e assim você dificilmente - quase que impossivel - terá conflito de códigos.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qualquer FOR/WHILE resolve suponho.

for ($codigo_unico = false, $i = 0; !$codigo_unico && $i < 10; $i++) {
    $novo_codigo = funcao_criar_novo_codigo();
    $codigo_unico = funcao_que_verifica_codigo_unico_retorna_true_or_false($novo_codigo);                                             
}

Geralmento eu evito WHILEs para não ficar em loop eterno por algum acidente (por isso tem limite de 10 no for).

 

@Guilherme Luiz deu uma sugestão boa e criar códigos a partir da data, geralmente você consegue códigos quase únicos. Eu pessoalmente para criar um código único, faria algo assim:

<?php uniqid("ID da Chave Primária do Banco de Dados", true); ?>

IDs de chave primárias são únicos, e o uniqid é uma função que é um identificador único com a data em milésimos de segundo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos esse código, tem que ser exclusivamente numérico, e um código de barras simples para carnês de pagamento, com 12 dígitos, uso a seguinte função para gerar os codigos:

function gerabarras(){
	$novo_valor= "";
	$valor = "0123456789";
	srand((double)microtime()*1000000);
	for ($i=0; $i<12; $i++){
	$novo_valor.= $valor[rand()%strlen($valor)];
	}
	$codbarras = "01".$novo_valor;
	return $codbarras;
}

dai quando vai gravar no banco, as vezes acontece de gerar um que ja esta salvo, e causa erro, preciso de um laço que verifique o código de barras, e veja se já existe, se já existe, tenta de novo, ate aparecer uma combinação que seja única

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que você não entendeu meu FOR quando escrevi, então vou tentar novamente.

for ($codigo_unico = false, $i = 0; !$codigo_unico && $i < 10; $i++) {
    $novo_codigo = gerabarras();
    $codigo_unico = verificar_codigo($novo_codigo);                                             
}

function verificar_codigo($cod) {
    // conecta ao banco e procura se existe este código
    // ...                                         

    if (!$existe_codigo) {
       return true;                                                       
    }

    return false;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 09/07/2017 at 01:54, Kosonome disse:

Acho que você não entendeu meu FOR quando escrevi, então vou tentar novamente.


for ($codigo_unico = false, $i = 0; !$codigo_unico && $i < 10; $i++) {
    $novo_codigo = gerabarras();
    $codigo_unico = verificar_codigo($novo_codigo);                                             
}

function verificar_codigo($cod) {
    // conecta ao banco e procura se existe este código
    // ...                                         

    if (!$existe_codigo) {
       return true;                                                       
    }

    return false;
}

eu entenid amigo seu for, mas a quantidade de codigos geradas é variavel,  nunca e mesma, pode ser 1, 2 ou 40

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
$code = '';
$numeros = str_split('012345678901234567890', 1);
for ($i = 0; $i < 4; ++$i) {
    $code .= $numeros[array_rand($numeros)];
}
$resultado = $code . time();

echo $resultado;

 

Duvido muito que consiga exibir o mesmo código numérico duas ou mais vezes com isso.

 

Só que o problema é que está tentando encontrar chifre em cabeça de cavalo....

 

Como o Guilherme disse, é mais vantajoso e correto usar, uma chave primária auto-increment e deixar o SQL fazer a gestão dos dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É simples, você inicia buscando o código no banco, e não fazendo a inserção.

 

Tipo assim, select cod_barra from tabela where cod_barra = '123456789102'

'

Após sua função que gera o cod_barras automáticamente, selecione no banco de dados algum codigo que foi gerado pela sua funcao, se não encontrar, cadastre, caso contrario chame a função novamente para gerar um novo código.

 

Não comece inserindo o código de barras gerado e sim consultando se o codigo gerado já existe.

 

@icarof

Outra coisa, trabalha com classes no PHP e crie uma classe para gerir e representar suas tabelas e consultas a banco de dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, não é questão de criar cifre em cabeça de cavalo, entendam que o campo, de código de barras ja é único, assim como a id, não posso deixar que o banco gerencie, pois esse códigos são dinâmicos, esses dígitos, são adicionados a outros identificadores, tipo:  cod_instituição + cod_curso + identificador aluno + código da função, e todas essas combinações são dinâmicas.

 

Josimar, creio que sua ideia parecer ser a mais sensata, vou testar e ver se da certo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Josimar, sua ideia deu certo em partes, pois ainda encontra conflito.

preciso criar um laço que fique gerando e buscando até encontrar um que passe.

to tentando com Do Whille, mas ainda sem sucesso.

 

alguma ideia?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, resolvi meu problema, usando o Do While, fiz no primeiro laço 2 verificações como josimar sugeriu, caso nas duas ele nao gere um unico, ele repete o laço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.