Ir para conteúdo

POWERED BY:

Arquivado

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

Sttranho

Banco, como saber se há 2 ou mais valores iguais ?

Recommended Posts

Pessoal, estou com um pepininho aqui.

 

com ajuda dos foruns, fiz um gerador de cógido alpha-numerico, onde ele já cria e já salva no banco.

segundo a minha lógica, fiz com que nao salvasse 2 códigos iguais, mas nao sei pq estou com receio que haja 2 códigos iguais e isso não poderá existir pois terei 20mil cupons, e cada um terá que ter um código diferente.

 

como eu posso verificar se tenho em meu banco 2 ou mais códigos iguais ?

 

=========

só por desencargo de conciência, estou postando meu código abaixo, se minha lógica estiver correta, dai acredito que nao terá 2 códigos iguais.

=========

Código: Gera codigo e grava -> gerador.php (Aparentemente funcionando)

<?
include('conecta.php');
?>
<?
// Gera código alpha-numerico
$c = 0;
$n = 0;
while($c <= 500){ // while - numero de codigos - gerar de 500 em 500 para nao dar estouro de memoria e nem muito lento a resposta.
$letras  = array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','X','W','Y','Z');
$numeros = array(2,3,4,5,6,7,8,9);
$total_let = count($letras)-1;
$total_num = count($numeros)-1;
$senha = $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)] . $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)] . $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)];
$senha = strtoupper($senha);
echo $c." - ".$senha."<br>";
$c++;
?>
<?php
// salva código no banco
$sqlcod = mysql_query("Select * from codigo_validacao where cod_codigo = '$senha'")or die(mysql_error("Erro com o Banco de Dados"));
$cod=mysql_fetch_array($sqlcod);
$codigo = $cod['cod_codigo'];
// se código "novo" for igual a um já existente, ecreve aviso, e pulo p proximo. se for diferente, grava no banco.
if($codigo == $senha){
echo $n." o similaridade de código novo com codigo já existente ".$codigo." = ".$senha."<br />";
}else{
mysql_query("INSERT INTO codigo_validacao (cod_codigo) VALUES ('".$senha."') ");
}
$n++;
}// while - numero de codigos
?>

===================================

Fiz, um "verificador", mas é ai que tá meu pior problema... acho que nao tá funcionando... estou usando DISTINCT, mas acho que de forma errada

===================================

 

Código: onde DEVERIA me mostrar apenas os registros com códigos repetido... MAS TÁ DANDO PROBLEMA. alguem pode me ajudar ?

-> verifica.php

<?php
$n2 = 0;
$sqlcod2 = mysql_query("SELECT DISTINCT(cod_codigo), cod_id FROM codigo_validacao ORDER BY cod_codigo DESC")or die(mysql_error("Erro com o Banco de Dados"));
while($cod2=mysql_fetch_array($sqlcod2)){
echo $n2." - ".$cod2['cod_id']." - ".$cod2['cod_codigo']." <br />";
$n2++;
}// while - numero de codigos
?>
==============================================

Abraço galera. espero que tenham entendido o meu problema.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A consulta para verificar se há valores duplicados poderia ficar assim:

 

SELECT cod_codigo, COUNT(cod_id) AS QTD FROM codigo_validacao GROUP BY cod_codigo
HAVING QTD > 1
ORDER BY QTD DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem algum motivo pra não usar auto-increment ?

Sim, como explicado acima, esse tal código, será impresso em 20mil "cupons", um código diferente do outro.

 

e para que ninguem dê uma de expertinho se cadastre e digite seu código numérico, e se cadastre denovo digitando o codigo numerico seguinte,

ex: 1, 2, 3, 4...

 

fizemos o código Alpha numérico, (letras e numeros) dessa forma saberá apenas seu código recebido, e ninguem tm como saber qual o valor do outro código.

imagine qual a probabilidade de chutar 1 código com 5caracteres, composto de letras e numeros, e apenas 20mil serão validados pois quando ele for se cadastrar no site, o sistema irá verificar se o tal código existe (valido) ou nao.

 

sendo assim, temos no banco uma tabela com 2 campos: cod_id, cod_codigo -> onde cod_id é auto-increment e cod_codigo é o código alpha-numerico.

 

mas vou aproveitar o Post e agradescer o Kandrade pois segundo os teste que fiz, deu certo.

 

Flw.

 

Obrigadao

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, não entendi muito bem o teu esquema.

 

você tem os caracteres alpha numericos em uma tabela?

você tem os cadastros usados gravados em outra tabela?

O cara digita o código dele e é gerado pelo sistema para ver se bate ?

 

Como que é o esquema?

 

 

Tipo, eu faria o seguinte:

2 Tabelas

 

1º tabela - codigos

idCodigo - inteiro - auto increment
codigo - varchar ou char
status - padrao 0
ps: ta certo que são 20 mil códigos, mas ...

 

2º tabela - cadastros

idCadastro
nome
....
fkCodigo - int - not null - referencia a tabela de codigo

Ai o que tu faz

o espertinho vai lá, se cadastra e bate o codigo dele

ai você pega o codigo que ele bateu e ve se é valido entre os 20 mil e se o status é 0 e muda o status para 1 deste codigo e feito.

 

assim o codigo usado por ele já é marcado que ta usado, assim o próximo que bater um código já usado, o status vai ser 1, ai já bloqueia.

 

Acho que deu para entender, também nao sei se é assim :P

 

 

abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

é isso ai... 2 tabelas... verificador de codigo com status... foi isso que fiz... e cógico com 6caracteres alphanuméricos.

 

=]

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas entendeu o esquema que te passei??

 

 

abraços

Sim, sim... você teve a mesma lógica q eu tive. =] Fiquei feliz, pois acho que to no caminho certo rs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok,

 

mas achei estranho o seu método de geração de codigo único e resolvi fazer um teste

 

o resultado deu negativo

 

dos 20 mil códigos gerados, 16.384 eram únicos.

 

pouco mais de 4 mil códigos repetidos..

 

além disso há outro erro menos grave,

gerou 20.001 códigos

pra resolver basta trocar

while($c <= $end){

while($c < $end){

 

o teste que fiz:

<?php
$c = 0;
$n = 0;
$end = 20000;
while($c < $end){ 

	$letras  = array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','X','W','Y','Z');
	$numeros = array(2,3,4,5,6,7,8,9);
	$total_let = count($letras)-1;
	$total_num = count($numeros)-1;
	$senha = $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)] . $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)] . $letras[rand(0,$total_let)] . $numeros[rand(0,$total_num)];

	$arr[] = strtoupper($senha);

	$c++;
}

echo 'total before: ' . count( $arr );
echo '<hr>';
$new = array_unique( $arr );
echo 'total after: ' . count( $new );
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz uma adaptação baseado no formato "Service Tag Express", que utiliza base 36 como exponencial

 

veja se isso ajuda a resolver o seu problema.

 

<?php

function convertTag($tag) {
  $tag = strtoupper($tag);
  $index = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');
  $count = strlen($tag);
  $count2 = $count - 1;
  for($i=0; $i<$count; $i++) {
	$digits[$count2] = substr($tag, $i, 1);
	$count2--;
  }
  $numb = 0;
  for($i=0; $i<count($digits); $i++) {
	if($i==0) {
	  $m = 1;
	} else {
	  $m = pow(36, $i);
	}
	$key = array_keys($index, $digits[$i]);
	$tmp = ($m * $key[0]);
	$numb += $tmp;
  } 
  return $numb;

 // usage
 // echo convertExpress('12542331601');
}


$c   = 20000000000;
$end = $c + 20000;
while( $c < $end ){
	//echo '<br>' . str_pad( $c, 11, '0', STR_PAD_LEFT ); 
	//echo '<br>' . convertExpress( str_pad( $c, 11, '0', STR_PAD_LEFT ) );


	$rs[] = convertExpress( str_pad( $c, 11, '0', STR_PAD_LEFT ) );
	$c++;
}

/** for debug purposes. check array size before and after PHP array_unique function
	echo 'total before: ' . count( $rs );
	echo '<hr>';
	$arr = array_unique( $rs );
	echo 'total after: ' . count( $arr );
*/
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom,

vamos lá... quando iniciei o sistema, fiz como postado aki... porem ao perceber oque você viu, de 20mil gerados 4 eram repetido fiz o seguinte...

como o codigo tenho apenas lá na empresa, vou por um portugol (logica) aki. nao vou me prender a liguagem exata, apenas a ideia.

 

até aqui imagine o meu gerador de código... que nao tem 0,o, i, 1 e outras letras com aparencia similares para nao confundir os senhores que nao tem lá muito conhecimento de info...

bom... continuando...

a cada código gerado ($codigo)chegava aki e passava por isso

$num_atual

$cod = mysql_query(select cod_codigo from codido_validacao where cod_codigo = $codigo)

while(mysql_fetch_array($cod){

se($cod['cod_codigo'] != ""){

delete codigo repetido

}else{

$num_total = 20000

se($num_atual < $num_total){

grava no banco

}

 

=============

 

ou seja dessa forma... ele pode até gerar codigos repetidos, mas ele antes de salvar no banco, irá verificar se já é existente, e apaga caso tenha duplicidade, e salva no banco se for código unico.

dai nesse caso terei o pretendido... 20.000 codigos unicos no banco.

 

=============

 

mas oque mais percebi de problema mesmo... foi que tive que gerar aos poucos, pois se mandar gerar os 20mil de 1 vez só... a pagina acabava caindo devido o tempo de resposta, loop, enfim... mas já tá tud gerado.. já to partindo pra outra etapa do sistema... mas qlqr ajuda ai é bem vinda... quem sabe futuramente eu necessite denovo.. já uso esse forum de apoio rs.rs.rs.

 

Abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz uma adaptação baseado no formato "Service Tag Express", que utiliza base 36 como exponencial......[continua]

Fui testar teu codigo acima, no intuito de tentar melhorar o meu sistema, e está dando erro:

Fatal error: Call to undefined function convertExpress() in D:\_localhost\wamp\www\25anos\pagina\teste_gera_cod.php on line 37

 

a tal linha é a:

$rs[] = convertExpress( str_pad( $c, 11, '0', STR_PAD_LEFT ) );
pelo que percebi, trata-se de array, e como nao entendo nada de array, e apanho pra caramba com array cada vez que preciso. resolvi questionar aki.

 

 

--------------

 

entao na tentativa de ver mesmo... fiquei mexendo, comentando e descomentando uma parte do código e alterando bem pouco essa parte do codigo.

 

$c   =	  20000;
$end = $c + 20000;
while( $c < $end ){
	echo '<br>' . str_pad( $c, 4, '0', STR_PAD_LEFT );
	//echo '<br>' . convertExpress( str_pad( $c, 11, '0', STR_PAD_LEFT ) );


   // $rs[] = convertExpress( str_pad( $c, 11, '0', STR_PAD_LEFT ) );
	$c++;
}

e o codigo rodou... porém ele nao gera código alphanumerico... ele gera a sequencia de 1 a 20000 e oque to precisando é 20mil codigos alphanumerico

 

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

foi mal.. esqueci de copiar a função

 

//125-423-316-01 
function convertExpress($tag) {
  $index = array('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','e');
  
  for($i=10; $i>=0; $i--) {
	$digits[$i] = '0';
	for($k=1; $k<=36; $k++) {
	  $tmp = (pow(36, $i)) * $k;
	  $tmp2 = $tag - $tmp;
	  if($tmp2 < 0) {
		$tmp = (pow(36, $i)) * ($k-1);
		$digits[$i] = $index[$k-1];
		$tag -= $tmp;
		break;
	  }
	  
	  if($tmp2 == 0) {
		$digits[$i] = $index[$k];
		$tag -= $tmp;
		break;
	  }   
	}
  }
  $leading = 1;
  $num = '';
  foreach($digits as $digit) {
	/*if($digit != '0') {
	  $num .= $digit;
	}*/
	if($leading) {
	  if($digit != '0') {
		$leading = 0;
		$num .= $digit;
	  }
	} else {
	  $num .= $digit;
	}
  }
  return $num;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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