Ir para conteúdo
Fórum Script Brasil
  • 0

Salvar numeros de forma ordenada no Banco de Dados


jcvilanova

Pergunta

Galera, tenho um formulario que grava o codigo de um jogo de numeros aleatorios e os campos DEZENA1, DEZENA2, DEZENA3 e DEZENA4. As dezenas são geradas aleatoriamente pelo sistema ainda enquanto array atraves da função RANGE. Ocorre que quando geradas elas vem desordenadas e eu não sei como fazer para gravar no banco a partir dai, mas gostaria de salvar de forma ordenada e crescente, ou seja, do maior para o menor. Como se faz isso ? 

Vejam ate onde consegui fazer ate agora, 

 

function ja_existe($jogo, $stmt) {
    $stmt->execute($jogo);
    return $stmt->fetchColumn() > 0;
}

$Numjogos = $_POST["jogos"];
$Qtydezenas = $_POST["dezenas"];
$Valormin = $_POST["de"];
$Valormax = $_POST["ate"];
$jogos = [];
$numeros = array_map(function($n) { return sprintf("%02d", $n); }, range($Valormin, $Valormax));

$Conn = // criar conexão
$stmt = $Conn->prepare('select count(*) from NomeDaTabela where Dez_1=? AND Dez_2=? AND Dez_3=? AND Dez_4=? AND Dez_5=? AND Dez_6=?');
for ($i = 1; $i <= $Numjogos; $i++) {
    while (true) {
        // embaralha
        shuffle($numeros);
        // pega os 6 primeiros e ordena
        $sorteio = array_slice($numeros, 0, $Qtydezenas);
        sort($sorteio);
        // se não é jogo repetido, adiciona
        if (! ja_existe($jogo, $Conn)) {
            $jogos[] = $sorteio;
            break;
        }
    }
}

Não sei como fazer a parte da inserção no banco e nem como faria para as dezenas irem ordenadas

Link para o comentário
Compartilhar em outros sites

10 respostass a esta questão

Posts Recomendados

  • 0

Para ordenar seis números sorteados, o código é esse:

<?php
$numbers=range(1,60);
srand((float)microtime()*1000000);
shuffle($numbers);
$palpites=[];
for($i=0;$i<=5;$i++){$palpites[]=$numbers[$i];}
asort($palpites);
foreach($palpites as $palpite){echo "$palpite ";}

Para colocar o palpite no banco de dados, eu preciso de mais informação. Eu sei que a aposta mínima de seis números na Mega-Sena custa R$ 5,00 e o maior custa R$ 25.025,00 com quinze números, mas é preciso verificar, eu não tenho certeza.
Eu vou criar uma tabela aposta com 6 campos ou 15 campos? Essa tabela vai identificar o cliente?
O cliente pode apostar os mesmos números mais de uma vez ou só uma vez?

Preciso de um campo para o número e data do sorteio?

Link para o comentário
Compartilhar em outros sites

  • 0

Veja bem, o programinha deve fazer o seguinte: Gerar os numeros aleatoriamente conforme escolhido nos campos do formulario (o usuario vai dizer de 1 até o numero maximo), depois embaralha os numeros gerados, depois retiro o numero de dezenas indicado no campo NumerodeJogos. Depois disso conecto com o banco de dados onde tenho uma tabela chamada sorteio e seleciono todos os registros desde que sejam iguais as dezenas geradas que estao no array. Então criei uma função que verifica se as dezenas geradas existem ou não no BD, se já existirem, ele elimina, se não, grava no BD. Depois sai. 

O programa ta funcionando direitinho até a função ja_existe(), bem ai ele da um erro que não consegui resolver. Veja o código inteiro abaixo: 

<?php
// verifica se o jogo já existe no banco

function ja_existe($sorteio, $stmt) {
    $stmt->execute($sorteio);
    return $stmt->fetchColumn() > 0;
}

$Servidor = "localhost";
$Banco = "megasena";
$Usuario = "root";
$Senha = "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $Numjogos = $_POST["jogos"];
    $Qtydezenas = $_POST["dezenas"];
    $Valormin = $_POST["de"];
    $Valormax = $_POST["ate"];
    $jogos = [];
    $numeros = array_map(function($n) { return sprintf("%02d", $n); }, range($Valormin, $Valormax));
}

   // $dez1 = 9;
  //  $dez2 = 37;
  //  $dez3 = 39;
   /// $dez4 = 41;
  //  $dez5 = 43;
  //  $dez6 = 48;

    $Conn = new PDO("mysql:host=$Servidor;dbname=$Banco", $Usuario, $Senha);
    //Antes eu estava fazendo a busca no Banco de Dados aqui, ocorre que os parametros da clausula WHERE ainda não existiam, 
    //pois os numeros ainda não haviam sido escolhidos conforme linha 49
   // $stmt = $Conn->prepare('SELECT * FROM sorteio WHERE Dez1= :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6');
  //  $stmt->bindParam(":d1", $dez1);
  //  $stmt->bindParam(":d2", $dez2);
  //  $stmt->bindParam(":d3", $dez3);
  //  $stmt->bindParam(":d4", $dez4);
  //  $stmt->bindParam(":d5", $dez5);
  //  $stmt->bindParam(":d6", $dez6);
  //  $stmt->execute();
    
  //  $dezenas = $stmt->fetch();

  //  print_r($dezenas);

    for ($i = 1; $i <= $Numjogos; $i++) {
        while (true) {
            // embaralho os numeros gerados
            shuffle($numeros);
         
            // retiro a quantidade de dezenas indicada no campo numero de jogos
           //$sorteio = array_slice($numeros, 0, $Qtydezenas);
          $sorteio = [10, 11, 29, 30, 36, 47];
 // aqui eu ordeno as dezenas escolhidas
           // sort($sorteio);
            // e então faço a busca no BD
            $stmt = $Conn->prepare('SELECT * FROM sorteio WHERE Dez1 = :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6');
            $stmt->bindValue(":d1", $sorteio[0]);
            $stmt->bindValue(":d2", $sorteio[1]);
            $stmt->bindValue(":d3", $sorteio[2]);
            $stmt->bindValue(":d4", $sorteio[3]);
            $stmt->bindValue(":d5", $sorteio[4]);
            $stmt->bindValue(":d6", $sorteio[5]);
            $stmt->execute();
            $dezenas = $stmt->fetch();
 //  exit;
           
            ?> <br> <br>
            <?php

            // se não é jogo repetido, adiciona no Array $jogos
            // A função deveria verificar se a combinação gerada já existe no BD, mas ta dando erro

            if (!ja_existe($sorteio, $stmt)) {
                $jogos[] = $sorteio;
                echo "<pre>";
                print_r($jogos);
               // exit;
   // echo "Esse jogo não existe: " .implode(', ', $sorteio). "<br>\n";
   break;
            }else{
                echo "Esse jogo já existe: " .implode(', ', $sorteio). "<br>\n";
      
            }
          
        }
    
        var_dump($jogos);
 ?> <br> <br> <br> <br>
 <?php

foreach ($jogos as $jogo) {
    // aqui eu gostaria de colocar um INSERT para passar os jogos gerados 
    //do Array $jogos para a tabela sorteio, e gostaria de imprimir na tela as cobinações
    
    "<br>\n" ;"<br>\n";
    echo "Os Jogos são: " .implode(', ', $jogo). "<br>\n";
}

}
?>
 
<form method="POST"> 

Numero de Jogos: <input type="text" size="10" name="jogos"> <br>
 
Quantidade de Dezenas em cada jogo: <input type="text" size="10" name="dezenas"> <br>
 
Iniciando em: <input type="text" size="5" name="de"> indo até:<input type="text" size="5" name="ate"> <br><br><br>
<input type="submit" name="BTEnvia" value="Enviar">  <input type="reset" name="BTApaga" value="Apagar">
       
<?php

?>
    
</body>
</html>
<br><br><br><br>

Se puder dar uma força, fico grato

Link para o comentário
Compartilhar em outros sites

  • 0

Ainda não entendi o propósito do projeto.

Preciso de uma ideia mais prática. Gerar número aleatório de acordo com o gosto do freguês é bem difícil de enxergar. 

Mesmo assim, eu posso sugerir a estrutura do banco de dados

aposta (id,palpites), onde id é chave primária e palpites é um string com 45 caracteres, ele teria essa cara:

1 , '[01 02 03 04 05 06]'

2, '[07 08 09 10 11 12]'

3, '[07 08 09 10 11 13]'

Como exercício, tente ver se o registro com id=2 é igual ao registro de id=3.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Veja bem, eu tenho um banco de dados com todos os resultados das loterias, tipo QUINA, MEGA SENA LOTOFACIL etc. Estou criando um programa que gera palpites para essas loterias. Ocorre que não faz sentido gerar um jogo que já saiu. Esses jogos nunca se repetem. Daí a ideia e gerar numeros aleatorios, ordena-los e então fazer uma consulta no BD para ver se aquela sequencia já saiu, se tiver saido, o sistema elimina, se não, ele gera as dezenas e grava no BD. 

Pronto, fiz toda esse caminho em PHP, porem, ta dando um erro justamente na hora de comparar se o jogo gerado já existe, entendeu ? 

Depois de alguns ajustes ficou assim:

 

<?php
// verifica se o jogo já existe no banco

function ja_existe($jogos, $stmt) {
    $stmt->execute($jogos);
    return $stmt->fetchColumn() > 0;
}

$Servidor = "localhost";
$Banco = "megasena";
$Usuario = "root";
$Senha = "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    $Numjogos = $_POST["jogos"];
    $Qtydezenas = $_POST["dezenas"];
    $Valormin = $_POST["de"];
    $Valormax = $_POST["ate"];
    $jogos = [];
    $numeros = array_map(function($n) { return sprintf("%02d", $n); }, range($Valormin, $Valormax));
}

   // $dez1 = 9;
  //  $dez2 = 37;
  //  $dez3 = 39;
   /// $dez4 = 41;
  //  $dez5 = 43;
  //  $dez6 = 48;

    $Conn = new PDO("mysql:host=$Servidor;dbname=$Banco", $Usuario, $Senha);
    //Antes eu estava fazendo a busca no Banco de Dados aqui, ocorre que os parametros da clausula WHERE ainda não existiam, 
    //pois os numeros ainda não haviam sido escolhidos conforme linha 49
   // $stmt = $Conn->prepare('SELECT * FROM sorteio WHERE Dez1= :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6');
  //  $stmt->bindParam(":d1", $dez1);
  //  $stmt->bindParam(":d2", $dez2);
  //  $stmt->bindParam(":d3", $dez3);
  //  $stmt->bindParam(":d4", $dez4);
  //  $stmt->bindParam(":d5", $dez5);
  //  $stmt->bindParam(":d6", $dez6);
  //  $stmt->execute();
    
  //  $dezenas = $stmt->fetch();

  //  print_r($dezenas);

    for ($i = 1; $i <= $Numjogos; $i++) {
        while (true) {
            // embaralho os numeros gerados
            shuffle($numeros);
         
            // retiro a quantidade de dezenas indicada no campo numero de jogos
           $sorteio = array_slice($numeros, 0, $Qtydezenas);
          //$sorteio = [10, 11, 29, 30, 36, 47];
 // aqui eu ordeno as dezenas escolhidas
           // sort($sorteio);
            // e então faço a busca no BD
            $stmt = $Conn->prepare('SELECT * FROM sorteio WHERE Dez1 = :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6');
            $stmt->bindValue(":d1", $sorteio[0]);
            $stmt->bindValue(":d2", $sorteio[1]);
            $stmt->bindValue(":d3", $sorteio[2]);
            $stmt->bindValue(":d4", $sorteio[3]);
            $stmt->bindValue(":d5", $sorteio[4]);
            $stmt->bindValue(":d6", $sorteio[5]);
            $stmt->execute();
            $dezenas = $stmt->fetch();
 //  exit;
           
            ?> <br> <br>
            <?php

            // se não é jogo repetido, adiciona no Array $jogos
            // A função deveria verificar se a combinação gerada já existe no BD, mas ta dando erro

            if (!ja_existe($jogos, $stmt)) {
                $jogos[] = $sorteio;
                echo "<pre>";
                print_r($jogos);
               // exit;
   // echo "Esse jogo não existe: " .implode(', ', $sorteio). "<br>\n";
   break;
            }else{
                echo "Esse jogo já existe: " .implode(', ', $sorteio). "<br>\n";
      
            }
          
        }
    
        var_dump($jogos);
 ?> <br> <br> <br> <br>
 <?php

foreach ($jogos as $jogo) {
    // aqui eu gostaria de colocar um INSERT para passar os jogos gerados 
    //do Array $jogos para a tabela sorteio, e gostaria de imprimir na tela as cobinações
    
    "<br>\n" ;"<br>\n";
    echo "Os Jogos são: " .implode(', ', $jogo). "<br>\n";
}

}
?>
 
<form method="POST"> 

Numero de Jogos: <input type="text" size="10" name="jogos"> <br>
 
Quantidade de Dezenas em cada jogo: <input type="text" size="10" name="dezenas"> <br>
 
Iniciando em: <input type="text" size="5" name="de"> indo até:<input type="text" size="5" name="ate"> <br><br><br>
<input type="submit" name="BTEnvia" value="Enviar">  <input type="reset" name="BTApaga" value="Apagar">
       
<?php

?>
    
</body>
</html>
<br><br><br><br>

 

Está gerando os numeros, esta ordenando porem, a funçao que deveria comparar o resultado do SELECT com o que tem no array tá dando um erro. Esse não consigo resolver. Eis a questão. 

Link para o comentário
Compartilhar em outros sites

  • 0

Fiz um código básico para ver como conferir um palpite com o banco de dados:
 

<?php
$pdo=new pdo("mysql:host=localhost;dbname=laravel","root","");
$query="drop table if exists sorteio"; 
$stmt=$pdo->prepare($query);
$stmt->execute();
$query="create table sorteio (`id` int NOT NULL AUTO_INCREMENT,
`dataDoSorteio` date DEFAULT NULL,`tipoJogo` varchar(10) DEFAULT NULL,
`numeroDoSorteio` int DEFAULT NULL,
`Sorteio` varchar(45) DEFAULT NULL,PRIMARY KEY (`id`))";
$stmt=$pdo->prepare($query);
$stmt->execute();
$query="insert into sorteio 
 (dataDoSorteio,tipoJogo,numeroDoSorteio,Sorteio)
 values 
 ('2021-12-14','Mega-Sena',2438,'[4,11,19,25,37,55]'),
 ('2021-12-16','Mega-Sena',2439,'[2,8,34,38,47,51]'),
 ('2021-12-20','Mega-Sena',2440,'[9,41,42,46,54,18]')";
$stmt=$pdo->prepare($query);
$stmt->execute();
$palpite=[4,11,19,25,37,55,57,60];
$query="select Sorteio from sorteio";
$stmt=$pdo->prepare($query);
$stmt->execute();
$sorteios=$stmt->fetchAll(PDO::FETCH_COLUMN);
echo "Testando palpite ".implode(" ",$palpite);
foreach($sorteios as $sorteio){
    echo "<br>Testando sorteio $sorteio";
    $j=json_decode($sorteio);
    if($j[0]==$palpite[0] && $j[1]==$palpite[1] && $j[2]==$palpite[2] && 
        $j[3]==$palpite[3] && $j[4]==$palpite[4] && $j[5]==$palpite[5]){goto fim;} 
   else {echo "palpite válido";exit;}}
fim: echo "<br>Palpite inválido pois os seis primeiros números já foram sorteados";

O problema todo é como comparar o palpite com os resultados já divulgados. Você impôs a regra de não repetir um resultado que já foi publicado. No meu código, eu usei um único palpite com seis números que já foram publicados, mas foram usados 8 dezenas. É quase improvável que o resultado da Mega-Sena se repita mais de uma vez, mas isso não quer dizer que seja impossível. Mas invalidar um palpite de 8 dezenas só porque tem 6 dezenas que já foram sorteadas não faz o menor sentido.

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

a minha tabela se chama sorteio, nela eu tenho os campos idjogo, dez1, dez2, dez3, dez4, dez5 e dez6. 

Como falei, o código ta pegando os dados do formulário certinho e gerando as combinações, o que ta me atrapalhando é que depois de gerar os numeros, escolher os seis e ordenar, eu quero que o sistema vá ao banco verificar se já existe aquela sequencia, se existir, elimina, se não, ele gera. Isso deve acontecer dentro desse loop que vai ser determinado pelo campo Numjogos. Ou seja, a possoa diz quantos jogos de 6 dezenas vai querer e o sistema vai la e prepara os jogos. Se eles já existirem, elimina e cria outros. Depois salva no banco. 

Link para o comentário
Compartilhar em outros sites

  • 0
3 horas atrás, jcvilanova disse:

a minha tabela se chama sorteio, nela eu tenho os campos idjogo, dez1, dez2, dez3, dez4, dez5 e dez6. 

Como falei, o código ta pegando os dados do formulário certinho e gerando as combinações, o que ta me atrapalhando é que depois de gerar os numeros, escolher os seis e ordenar, eu quero que o sistema vá ao banco verificar se já existe aquela sequencia, se existir, elimina, se não, ele gera. Isso deve acontecer dentro desse loop que vai ser determinado pelo campo Numjogos. Ou seja, a possoa diz quantos jogos de 6 dezenas vai querer e o sistema vai la e prepara os jogos. Se eles já existirem, elimina e cria outros. Depois salva no banco. 

Consegui terminar o meu código, ao invés de usar dez1, dez2, dez3, dez4, dez5 e dez6, eu usei apenas um campo texto chamado sorteio com esse formato '[dez1,dez2,dez3,dez4,dez5,dez6]', isso porque você falou de outras loterias que tem menos números ou mais números serem sorteados. Mesmo assim, o problema é como conferir o palpite aleatório com o que está no banco de dados. Deixei o meu código final logo acima. Espero que ele ajude no seu projeto, apesar de ter mudado a sua estrutura no banco de dados.

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

  • 0

Boa tarde!

Dando uma olhada geral aqui, realmente achei a organização do BD proposta pelo Frank melhor, pois os números sorteados ficam em um campo com uma estrutura de array ex: [10,12,22,44,45,59], o que facilita um pouco na organização e na codificação.

Mas tentando ajudar na estrutura original, nessa consulta SQL

'SELECT * FROM sorteio WHERE Dez1 = :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6'

supondo que :d1 :d2 :d3 :d4: d5 :d6 já esteja na ordem crescente, caso um jogo já esteja no BD ele será encontrado, basta para isso verificar se retornou algo ou não (que pelo que eu entendi era onde estava dando erro)

 

Podemos mudar o select para

'SELECT count(*) as resultado FROM sorteio WHERE Dez1 = :d1 AND Dez2= :d2 AND Dez3= :d3 AND Dez4= :d4 AND Dez5= :d5 AND Dez6= :d6'

e para simplesmente somar o a quantidade de consultas similares. Neste caso se o resultado for maior que zero então quer dizer que o jogo consultado já estava na lista do BD

aí neste trecho (ORIGINAL):

            if (!ja_existe($jogos, $stmt)) {
                $jogos[] = $sorteio;
                echo "<pre>";
                print_r($jogos);
               // exit;
   // echo "Esse jogo não existe: " .implode(', ', $sorteio). "<br>\n";
   break;
            }else{
                echo "Esse jogo já existe: " .implode(', ', $sorteio). "<br>\n";
      
            }

 

mudaria para 

            if ($dezenas['resultado']==0) {
                $jogos[] = $sorteio;
                echo "<pre>";
                print_r($jogos);
               // exit;
   // echo "Esse jogo não existe: " .implode(', ', $sorteio). "<br>\n";
   break;
            }else{
                echo "Esse jogo já existe: " .implode(', ', $sorteio). "<br>\n";
      
            }

 

 Como pode ver mudaria somente a 1a. linha, que é a comparação. Não estou acostumado com mysqli mas acredito que para ver o 'resultado' seja dessa forma $dezenas['resultado']

Se resultado == 0 ($dezenas['resultado']==0)  quer dizer que não achou nenhum registro

Por favor me corrijam qualquer coisa, afina isso aqui é forum e só estou tentando ajudar

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 0

O problema é o planejamento. O objetivo é criar palpites que não foram repetidos. Vamos supor que a loteria seja de apenas um número, logo, os possíveis palpites são necessariamente 10: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Mas, na vida real, a Caixa Econômica lhe concede o direito de concorrer com dois palpites, desde que pague um pouco mais.

Logo, os palpites podem ser 0,1 - 0,2 - 0,3 - 0,4 - 0,5 - 0,6 - 0,7 - 0,8 - 0,9, depois tem a fila do 1,0, 1,2, 1,3, 1,4 e assim por diante. Só com dois números os palpites são bem grandes. Imagine fazer um programa que trabalha com um palpite que sorteia seis números, mas o apostador pode jogar com até quinze números.

Se o jogador pode jogar até 15 palpites, não faz sentido trabalhar com um campo de apenas 6 números, daí porque trabalhei com vetor, ele é bem flexível, ele aumenta e diminui de acordo com as necessidades. Já um banco de dados com 15 campos pré definidos ocupa o mesmo espaço que os vetores, graças à tecnologia do Varchar(), ou seja, os campos também são flexíveis.

O problema é que o autor do projeto não quer os palpites não se repitam ao que já foi sorteado. Voltando à nossa primeira loteria, vamos supor que o número sorteado foi 1 no sorteio anterior. Faz sentido eu desconsiderar os palpites 1,0 1,2 1,3 1,4 1,5 1,6 1,7 1,8 1,9 só por que um dois palpites já foi sorteado? E quem é o matemático que afirmou que um número já sorteado não vai se repetir nunca mais?

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...