Sttranho 0 Denunciar post Postado Julho 14, 2008 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
Kandrade 7 Denunciar post Postado Julho 14, 2008 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
hinom 5 Denunciar post Postado Julho 15, 2008 tem algum motivo pra não usar auto-increment ? Compartilhar este post Link para o post Compartilhar em outros sites
Sttranho 0 Denunciar post Postado Julho 15, 2008 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
Kandrade 7 Denunciar post Postado Julho 15, 2008 Foi nada. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Compartilhar este post Link para o post Compartilhar em outros sites
Diego Henrique 0 Denunciar post Postado Julho 15, 2008 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 0ps: 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
Sttranho 0 Denunciar post Postado Julho 15, 2008 é 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
Diego Henrique 0 Denunciar post Postado Julho 16, 2008 Mas entendeu o esquema que te passei?? abraços Compartilhar este post Link para o post Compartilhar em outros sites
Sttranho 0 Denunciar post Postado Julho 16, 2008 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
Diego Henrique 0 Denunciar post Postado Julho 16, 2008 mas ta conseguindo aplicar ? conseguiu resolver?? Como ta o andamento?? abraços Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Julho 17, 2008 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
hinom 5 Denunciar post Postado Julho 17, 2008 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
Sttranho 0 Denunciar post Postado Julho 17, 2008 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
Sttranho 0 Denunciar post Postado Julho 23, 2008 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
hinom 5 Denunciar post Postado Julho 24, 2008 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