Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 ?
ObrigadoOlá!
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://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](https://pt.stackoverflow.com/questions/579/por-que-n%C3%A3o-devemos-usar-fun%C3%A7%C3%B5es-do-tipo-mysql)
[http://blog.thiagobelem.net/usando-o-mysqli-orientado-a-objetos](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.
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&comment=2250417