Ir para conteúdo

POWERED BY:

Arquivado

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

fideles

Verificar se número já existe

Recommended Posts

E ai pessoal, tudo na paz?

 

To me deparando com um problema que me parece ser simples mais não to conseguindo resolver.

 

Tenho um formulário de solicitações com 3 campos (nome, e-mail e obs) e antes da pessoa enviar ele mostra um numero aleatório(uso a função rand do php)

 

O problema que ta havendo cadastro no BD com o mesmo numero varias vezes. Ai veio a ideia de fazer uma verificação no BD (verifica se o numero exite, se exite gera outro se não mantém) Ai que me aparece o problema.

 

Gostaria da ajuda de vocês para me ajudarem a achar o erro, vejam o código abaixo;

 

<?php error_reporting(E_ALL ^ E_NOTICE); //controla erros do navegador
include("./gerenciamento/config3.php"); //arquivo de conexao do banco de dados

$numero_cadastra = rand(1,1000); //condição para gerar numeros

$verifica_numero = mysql_query("SELECT * FROM demandas_diversas"); //chama a tabela "demandas_diversas"

while($linha =@mysql_fetch_array($verifica_numero)){
$numero = $linha['numero']; //traz somenta a coluna numero para verificar os numeros que ja estao cadastrados no bd
}
if($numero_cadastra == $numero){ // "numero_cadastra" e a condicao para gerar os numero e "numero" e o nome da coluna no BD
	$cadastra = "$numero_cadastra"; //Se estiver cadastrado gera outro numero
}

?>

Ta certo o que eu fiz ou tem algo a mais que eu deveria fazer ?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Adicione, diretamente no banco de dados, uma unique constraint para os campos que você deseja que sejam único.

 

https://forum.imasters.com.br/topic/564945-duplicação-no-banco-de-dados-mysql/?do=findComment&amp;comment=2250417

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

Vou pontuar alguns trechos do seu código:

 

1 - Não sei o que exatamente o sistema faz, mas será que esse rand() não está muito restritivo?

$numero_cadastra = rand(1,1000); //condição para gerar numeros

Uma sugestão é você gerar um código aleatório com números e letras ou inserir a data junto. Exemplo: 971234 = 9 de julho / código 1234.

 

 

2 - Não faça isso:

$verifica_numero = mysql_query("SELECT * FROM demandas_diversas");

Dessa forma você está buscando todos os códigos e verificando a unicidade no PHP, o que é um enorme desperdício de recursos.

Ao invés disso faça assim:

$verifica_numero = mysql_query("SELECT 1 FROM demandas_diversas WHERE codigo = '{ $numero_cadastra }'");

Explicando: se já estiver cadastrado, o banco retornará 1, do contrário não retornará nada. Isso é tudo que você precisa saber do banco nesse momento.

 

 

3 - Funções mysql_ estão obsoletas em versões mais recentes do PHP e você certamente passará por problemas com esse código em algum momento.

Veja: https://imasters.com.br/back-end/mysql-obsoleto-nao-utilize-funcoes-mysql_

https://pt.stackoverflow.com/questions/579/por-que-não-devemos-usar-funções-do-tipo-mysql

http://blog.thiagobelem.net/usando-o-mysqli-orientado-a-objetos

 

 

4  - Finalmente, sobre o algoritmo da unicidade, você pode fazer algo assim para funcionar:

<?php
function gerarCodigo() {
    // mt_rand é melhor que rand: http://php.net/manual/pt_BR/function.mt-rand.php
    return mt_rand( 1000, 9999 );
}

function codigoEstaCadastrado( $codigo ) {
    // aqui você roda a consulta e retorna TRUE ou FALSE
    // de acordo com a existência do código gerado
}

do $codigo = gerarCodigo();
while( codigoEstaCadastrado( $codigo ) );

// Veja sobre o do/while: http://php.net/manual/pt_BR/control-structures.do.while.php

Basicamente é o seguinte:

Faça (do) um novo código enquanto (while) este já estiver cadastrado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Fala galera, tudo certo?
       
      Seguinte: No servidor A estou tentando fazer uma consulta com o servidor B, mas está dando erro.
      Estou usando o mesmo código de conexão do servidor B que funciona perfeitamente, mas no servidor A, dá erro.
      Segue código:
       
      $host = 'servidor B';
      $user = 'user';
      $pass = '********';
      $db   = 'banco';
       
      // conexão e seleção do banco de dados
      $conexao = mysqlI_connect($host, $user, $pass, $db);
      mysqlI_set_charset($conexao,"utf8");
      //print "Conexão rodando e OK!"; 
      //mysqlI_close($conexao);
       
      Alguém pode me ajudar?
    • 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
    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
×

Informação importante

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