grldesign 0 Denunciar post Postado Fevereiro 11, 2004 O Problema é o seguinte: Possuo 3 tabelas: - promocao - inscritos - sorteio Para efetuar o sorteio, seleciono a promoção em um select, cujo value é o seu id na tabela "promocao" e digito o número de sorteados (limite) em um input. Esse form é enviado para uma outra página que recebe os dados, busca na tabela inscritos todos os cadastrados com o "id_promo" igual ao "id" da promocao enviado pelo form. Para sorteá-los preciso pegar o "id" de cada um na tabela de "inscritos", organizar e sortear randomicamente. Até aí tudo bem. Mas os "ids" são fora da ordem, pois o cadastro é feito a toda hora no site, em diversas promoções, sendo assim fica tudo fora de ordem (ex: id_promo=1 retorna ids (5,6,9,15,27,85,110,112)) e quero sortear um número x dentre eles. Tentei utilizar a função rand() mas ele sorteia um número sequencial entre limites pré-definidos. Preciso que sorteie assim, utilizando números avulsos e que não se repita nunca o mesmo número em um sorteio. No código abaixo adicionei uma ação que envia e-mail sempre que o usuário ganha, mas preciso é saber do resto, do sorteio. <? $id_promocao = $_REQUEST[promocao]; $limite = $_REQUEST[limite]; require('docs/conexao.php'); $select = "SELECT * FROM tb_inscritos WHERE id_promo='$id_promocao' ORDER BY nome LIMIT $limite"; $query = mysql_query($select); $conta = @mysql_num_rows($query); if($conta < $limite) { echo "Número se Usuários a serem sorteados ($limite) é superior ao número de cadastrados inscritos ($tot)"; echo "<br><br><a href='java script:window.history.go(-1)'>Volte e tente novamente</a>"; } else { $i = 1; $c = 1; while($row = mysql_fetch_array($query)) { $numero[$i] = $row[id]; $nome[$i] = $row[nome]; $i++; } echo "<br><br>"; echo "<strong> Sorteados </strong><br><br>"; $i--; $a = 1; for($n=1; $n<=$limite; $n++) { $sorteio[$a] = rand(1, $i); $temp = $sorteio[$a]; while(in_array($temp, $sorteio)) { $sorteio[$a] = rand(1, $i); } $i = $a; echo "<strong>$sorteio[$a]</strong>. $nome[$i]<br>"; $pro = mysql_query("SELECT * FROM tb_promocoes WHERE id='$id_promocao'"); $mensagem = "Parabéns, você ganhou um prêmio da Promoção <strong>"$linha[titulo]"</strong>"; $mensagem.= "<br><br>O prêmio será enviado ao endereço cadastrado, posterior a um contato telefônico para confirmação do endereço."; $headers = "Content-Type: text/html; charset=\"ISO-8859-1\"\n\n"; $envia = mail("$row", "Orbytal Promoções - Parabéns Você Ganhou!", $mensagem, $headers); if($envia) { echo "<i>E-mail de aviso enviado!</i><br>"; } else { echo "<i>E-mail de aviso não enviado!<br></i>"; } $a++; } } ?> Espero que alguem ajude.... Compartilhar este post Link para o post Compartilhar em outros sites
Keitaro 0 Denunciar post Postado Fevereiro 11, 2004 nem cheguei a ler o codigo.. fui mais pelo topico... tipo eu pensei do modo abaixo mas n testei, espero que entenda. $array_x $i = 1; // So pra numeracao.. desconsiderando a aplicacaowhile(count($array_x) > 0){$n = rand(0, count($array_x)-1);echo "<br>$i - $array_x[$n]<br>";unset($array_x[$n]);reset($array_x);$i++;} Uma breve explicacao, ele seleciona um numero aleatorio dentro das possibilides, que varia com o numero de valores dentro da array. Uma vez selecionado uma array, ele apaga o registro, pelo UNSET e apos isso ele reorganiza a array, de forma que nao fiquem buracos na array... exemplificando, digamos que tenha 3 valores.. 0,1,2.. o valor1 foi eliminiado.. portanto fica 0, ,2; com o reset ele torna 0,1. O loop é feito enquanto houver valor na array, pelo count($array_x) > 0. Qualquer duvida retorna... deve servir pro seu codigo. obs.. vendo o seu codigo.. n precisa registrar um valor da array sempre especificando um numero. Se os dados forem inseridos sequencialmente, digamos.. pelo while -> mysql_fetch_array... basta usar: $variavelARRAY[], apenas o [] bastam, e os valores seram armazenados sequencialmente. Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 11, 2004 Então ficaria algo + ou - asssim? <? $id_promocao = $_REQUEST[promocao]; $limite = $_REQUEST[limite]; require('docs/conexao.php'); $select = "SELECT * FROM tb_inscritos WHERE id_promo='$id_promocao' ORDER BY nome LIMIT $limite"; $query = mysql_query($select); $conta = @mysql_num_rows($query); if($conta < $limite) { echo "Número se Usuários a serem sorteados ($limite) é superior ao número de cadastrados inscritos ($tot)"; echo "<br><br><a href='java script:window.history.go(-1)'>Volte e tente novamente</a>"; } else { $c = 1; while($row = mysql_fetch_array($query)) { $numero[] = $row[id]; $nome[] = $row[nome]; } echo "<br><br>"; echo "<strong> Sorteados </strong><br><br>"; $i = 1; // So pra numeracao.. desconsiderando a aplicacao while(count($array_x) > 0) { $n = rand(0, count($array_x)-1); echo "<br>$i - $array_x[$n]<br>"; unset($array_x[$n]); reset($array_x); echo "<strong>$i</strong>. $nome[$n]($numero[$n])<br>"; $pro = mysql_query("SELECT * FROM tb_promocoes WHERE id='$id_promocao'"); $linha = mysql_fetch_array($pro); $mensagem = "Parabéns, você ganhou um prêmio da Promoção <strong>"$linha[titulo]"</strong>"; $mensagem.= "<br><br>O prêmio será enviado ao endereço cadastrado, posterior a um contato telefônico para confirmação do endereço."; $headers = "Content-Type: text/html; charset=\"ISO-8859-1\"\n\n"; $envia = mail("$row", "Orbytal Promoções - Parabéns Você Ganhou!", $mensagem, $headers); if($envia) { echo "<i>E-mail de aviso enviado!</i><br>"; } else { echo "<i>E-mail de aviso não enviado!<br></i>"; } $a++; } } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Keitaro 0 Denunciar post Postado Fevereiro 11, 2004 Opz.. fiz de madrugada o codigo e acabei confundindo.. o RESET, ele poe o ponteiro no valor inicial, e nao reordenar.. falha minha.. bom, ou jeito é ir nos loops. A minha solucao é essa: <?$array_x = array("55","13","44","4","3","6","7","35");$i = 1; // So pra numeracao.. desconsiderando a aplicacao$possibilidades = count($array_x) - 1;while( count($array_x) > 0 ){$n = rand(0, $possibilidades);while( !empty($saidas) AND in_array($n,$saidas)){ //echo "<p style='color: red'>passou por aqui</p>"; unset($n); $n = rand(0, $possibilidades);}echo "<br>$i - $array_x[$n]<br>";//echo "Valor de N: $n - Valores existentes: " .count($array_x); [COLOR=red]<<-- tinha um erro aki.. tinha um " a mais..[/COLOR]unset($array_x[$n]);$saidas[] = $n;$i++;}?> nas partes de comentarios, se quiser ver como o script corre eh so eliminar. É que faco isso pra poder visualizar como o codigo esta indo, as vezes ele nao passa por lugares que eu acho que passa e fico olhando o codigo e n saio do lugar.. Bom, qlqr duvida no codigo você me fala.. você tem de adaptar ao seu codigo... Compartilhar este post Link para o post Compartilhar em outros sites
Keitaro 0 Denunciar post Postado Fevereiro 11, 2004 <?$id_promocao = $_REQUEST['promocao'];$limite = $_REQUEST['limite']; require('docs/conexao.php'); $select = "SELECT * FROM tb_inscritos WHERE id_promo='$id_promocao' ORDER BY nome LIMIT $limite";$query = mysql_query($select);$conta = @mysql_num_rows($query); if($conta < $limite){ echo "Número se Usuários a serem sorteados ($limite) é superior ao número de cadastrados inscritos ($tot)"; echo "<br><br><a href='javascript:window.history.go(-1)'>Volte e tente novamente</a>";} else{ $c = 1; while($row = mysql_fetch_array($query)) { $numero[] = $row[id]; $nome[] = $row[nome]; } echo "<br><br>"; echo "<strong> Sorteados </strong><br><br>";//------------------------ $i = 1; // So pra numeracao.. desconsiderando a aplicacao $possibilidades = count($numero) - 1; while( count($numero) > 0 ) // Entra neste WHILE { $n = rand(0, $possibilidades); while( !empty($saidas) AND in_array($n,$saidas)) // E nao neste. { //echo "<p style='color: red'>passou por aqui</p>"; unset($n); $n = rand(0, $possibilidades); } echo "<br><b>$i:</b> $numero[$n] => $nome[$n]<br>"; //echo "Valor de N: $n - "Valores existentes: " .count($numero); unset($numero[$n], $nome[$n]); $saidas[] = $n; $i++; } //------------- // Ta faltando codigo... onde você consegue o $linha? // So para ver se funciona.. depois o codigo abaixo.. entrari no while acima.../* $pro = mysql_query("SELECT * FROM tb_promocoes WHERE id='$id_promocao'"); $mensagem = "Parabéns, você ganhou um prêmio da Promoção <strong>"$linha[titulo]"</strong>"; $mensagem.= "<br><br>O prêmio será enviado ao endereço cadastrado, posterior a um contato telefônico para confirmação do endereço."; $headers = "Content-Type: text/html; charset=\"ISO-8859-1\"\n\n"; $envia = mail("$row[email]", "Orbytal Promoções - Parabéns Você Ganhou!", $mensagem, $headers); if($envia) { echo "<i>E-mail de aviso enviado!</i><br>"; } else { echo "<i>E-mail de aviso não enviado!<br></i>"; } /*} ?> Refiz o codigo... nao sei se funciona.. n tenho o seu DB... Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 12, 2004 Ele não sorteia nada, fica trabalhando em loop infinito até que o tempo de execução máximo é ultrapassado e o funcionamento é truncado.Não sei o que pode ser, mas acho que é algo ligado à variavel $saidas que não foi setada em lugar algum e apareceu no meio do codigo la.ERRO: Sorteados 1: => GValor de N: 0 - 'Valores existentes: ' count(Array)passou por aquipassou por aquipassou por aquipassou por aquipassou por aquie teve uns 50 "passou por aqui" abaixo destes... ficou em loop. o Que pode ser? Compartilhar este post Link para o post Compartilhar em outros sites
Keitaro 0 Denunciar post Postado Fevereiro 12, 2004 eh gozado.. pq se você testar o script q fiz.. n da erro.. mas isso ocorre pq trabalhei com o seu script sem testa-lo no olho.. n sei como estao sendo recebidos os dados da tabela.. e etc... você vai ter q adaptar o codigo.. cria um arquivo o testa o meu script.. você vai ver o q acontece.. EDITADO: SCRIPT TESTE: http://animexplorer.jbrasil.com/sorteio_se...m_repeticao.php o server deles tah lento pra fazer o loop.. EDITADO2: CORRECAO no script tinha um erro.. tinha um " a mais.. eu tirei.. qlqr duvida so olhar acima q você onde tava o erro. Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 13, 2004 Keitaro, os dados $id_promocao e $limite sao valores inteiros.O id_promocao vai da 1 ate o 99999999999 e o de valores é digitado pelo administrador...Pode me dar uma ajuda? Compartilhar este post Link para o post Compartilhar em outros sites
Keitaro 0 Denunciar post Postado Fevereiro 13, 2004 mas você esta qrendo fazer sorteio de todos os registros da tabela ou tem algum limite? Provavelmente fazer um registro de mais de 100.000 registros vai pesar...como você disse que é sorteio de promocao, quantos ganhadores terao? ou defina melhor o q você qr fazer. Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 13, 2004 São várias promoções cadastradas em uma tabela "tb_promocoes". Os inscritos ficam em outra "tb_inscritos", a qual armazena o id, id_promocao, nome e email. O administrador entrará no sistema e escolhera a promoção "Ganhe um Walk Sound", cujo id é 5 na tb_promocoes. Também irá definir que o $limite, que nada mais é do que o número de ganhadores. Sendo assim vem a parte do sorteio, que busca na "tb_inscritos" todos os registro que contiverem "id_promocao = 5" e pegará os respectivos "id" de cada um dos inscritos. Os resultados são números fora de ordem, portanto devem ser organizados em um array para que cada um receba uma posição(1,2,3,4,5...) para que, usando a função rand() possa-se realizar o sorteio. Óbvio que o mesmo número não poderá ser sorteado 2 vezes no mesmo sorteio. Então a cada numero sorteado, este deve ser impedido de ser sorteado novamente. Finalizando, a cada número sorteado, deve ser enviado um e-mail de notificação, mas isto é fácil de fazer. O que preciso é o sistema de sorteio... Segue abaixo meu BD. TABELA tb_promocoes TABLE tb_promocoes ( id int(11) auto_increment, titulo varchar(50) NOT NULL, descricao text NOT NULL, status varchar(10) NOT NULL, foto_produto varchar(30) NOT NULL, foto_fornecedor varchar(30) NOT NULL, PRIMARY KEY (id)); TABELA tb_inscritos TABLE tb_inscritos ( id int(5) auto_increment, id_promocao int(11) DEFAULT '0' NOT NULL, nome varchar(35) NOT NULL, email varchar(40) NOT NULL, PRIMARY KEY (id), KEY id (id)); Compartilhar este post Link para o post Compartilhar em outros sites
Keitaro 0 Denunciar post Postado Fevereiro 13, 2004 Veremos se entendi com as linhas abaixo :D Bom, temos entao que pegar os possiveis ganhadores, $promocao = 3; SELECT id FROM tb_inscritos WHERE id_promocao = '$promocao' feito isso, temos que armazenar os possiveis candidatos. Como id eh primary key/auto_icrement, temos certeza que n tera valores repetidos, para evitar que o BD busque dados que no momento sao inuteis, vamos apenas capturar o ID. Digamos que jah tenha feito o query, e armazenado na variavel: $result while($row = mysql_fetch_array($result)) { $id[] = $row['id']; } agora entraria o script que havia feito anteriormente: Abaixo o codigo completo: $promocao = 3;$sql = "SELECT id FROM tb_inscritos WHERE id_promocao = '$promocao'";$result = mysql_query($sql);while($row = mysql_fetch_array($result)){ $id[] = $row['id'];}$i = 1; // So pra numeracao.. desconsiderando a aplicacao$possibilidades = count($id) - 1;$qtd_ganhadores = 10;echo "<p><b>Os ganhadores sao:</b></p>";while( $i <= $qtd_ganhadores ) // AGORA TEMOS UMA LIMITACAO AQUI, QUE SERA O NUMERO DE GANHADORES POSSIVEIS{$n = rand(0, $possibilidades);while( !empty($saidas) AND in_array($n,$saidas)){//echo "<p style='color: red'>passou por aqui</p>";unset($n);$n = rand(0, $possibilidades);}echo "<br>$i - $id[$n]<br>";//echo "Valor de N: $n - Valores existentes: " .count($array_x);unset($id[$n]);$saidas[] = $n;$sorteados[] = $id[$n]; // Aqui teremos os id's ganhadores$i++;} agora testa ai, pra ve se ocorre o sorteio. Espero que funcione.. Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 20, 2004 Infelizmente não está funcionando corretamente... Ele sorteia somente o número 36 e da erro pois fica executando mais de 30 segundos a instrução de determinada linha... Segue abaixo o erro e a linha que ocorre. Os ganhadores sao:1 - 36Fatal error: Maximum execution time of 60 seconds exceeded in /home/orbytal/public_html/cadastro/sorteios_realizar_gravar.php on line 56 <? $id_promocao = $_REQUEST['promocao']; $limite = $_REQUEST['limite']; require('docs/conexao.php'); $select = mysql_query("SELECT * FROM tb_inscritos WHERE id_promo='$id_promocao' ORDER BY nome LIMIT $limite"); while($row = mysql_fetch_array($select)) { $id[] = $row['id']; } $i = 1; // So pra numeracao.. desconsiderando a aplicacao $possibilidades = count($id) - 1; $qtd_ganhadores = 10; echo "<p><b>Os ganhadores sao:</b></p>"; while( $i <= $qtd_ganhadores ) // AGORA TEMOS UMA LIMITACAO AQUI, QUE SERA O NUMERO DE GANHADORES POSSIVEIS { $n = rand(0, $possibilidades); while( !empty($saidas) AND in_array($n,$saidas)) { //echo "<p style='color: red'>passou por aqui</p>"; unset($n); $n = rand(0, $possibilidades); } echo "<br>$i - $id[$n]<br>"; //echo "Valor de N: $n - Valores existentes: " .count($array_x); unset($id[$n]); $saidas[] = $n; $sorteados[] = $id[$n]; // Aqui teremos os id's ganhadores $i++; } ?> Estou precisando urgentemente deste script...se quiser te dou acesso ao meu host pra testar o script... Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 21, 2004 Se alguém puder ajudar eu fico grato.... Compartilhar este post Link para o post Compartilhar em outros sites
grldesign 0 Denunciar post Postado Fevereiro 21, 2004 Keitaro, perdemos tempo a toa...a linha abaixo faz tudo que aquele codigo não fez...mysql_query("SELECT * FROM tb_inscritos WHERE id_promocao='$id_promocao' ORDER BY rand() LIMIT $limite");hehehe... so pra informar que corrigi tudo aqui...valeu pela ajuda... Compartilhar este post Link para o post Compartilhar em outros sites