Erro ao comparar conteudo do Array com BD em PHP

PHP

Banco de Dados

04/08/2023

Galera, estou tentando criar um programinha em PHP que gere numeros para jogos de loteria como Mega Sena, Quina etc. Fiz um formulario com os campos NumerodeJogos, QuatidadeDezenas, IniciandoEm e TerminandoEm. O programa deve pegar esses dados e gerar as dezenas aleatórias, depois embaralha os numeros, retira a quantidade de dezenas que tem no campo e depois ordena. Daí, o sistema deve pegar as dezenas escolhidas e fazer um SELECT no banco de dados para ver se aquelas dezenas já existem, se encontrar ele guarda numa variavel. Depois uso uma função que verifica se o conteudo da variavel existe no BD, se ele existir é eliminado, se não ele joga no array $jogos. mas está ocorrendo um erro e nao to conseguindo corrigir. Alguem poderia dar uma força ???? Criei o seguinte código:


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

function ja_existe($jogo, $stmt) {
    $stmt->execute($jogo);
    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 = [];
    $sorteio =[];
    $numeros = array_map(function($n) { return sprintf("%02d", $n); }, range($Valormin, $Valormax));
}


    $Conn = new PDO("mysql:host=$Servidor;dbname=$Banco", $Usuario, $Senha);
 
    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();
            
             ?> <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($jogo, $stmt)) {
                $jogos[] = $jogo;
                echo "<pre>";
                print_r($jogos);
               // exit;
   // echo "Esse jogo nao 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>
Joao Claudio

Joao Claudio

Curtidas 0

Respostas

Arthur Heinrich

Arthur Heinrich

04/08/2023

Tem muita informação faltando. Por exemplo, você diz que está ocorrendo um erro. Tem alguma mensagem, ou apenas não faz o que você quer?

Uma coisa que me ocorreu, pode ter a ver com o filtro:

$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]);

Sabemos que a variável $sorteio[0] retorna um texto. Logo, imagino que esteja fazendo bind com o tipo VARCHAR ou coisa do tipo.
Sabemos também que, para as dezenas 1 a 9, devido à forma como foi gerado, as dezenas foram precedidas do '0': '01', '02', '03', ...
Na tabela a coluna é do tipo VARCHAR também e as dezenas estão preenchidas com o zero à esquerda? Ou a coluna é numérica?

Dependendo do banco, pode ser que ele compare de forma diferente.

Além disso, você executa a query da seguinte forma:

$stmt->execute();
$dezenas = $stmt->fetch();

E utiliza um if suspeito:

if (!ja_existe($jogo, $stmt)) {
$jogos[] = $jogo;
echo "<pre>";
print_r($jogos);

Dentro da função, aparentemente você executa a query novamente. Se achar o registro, supostamente a variável $jogo contem o jogo encontrado. Mas não entra no if.

Se não encontrar, entra no if, mas atribui: $jogos[] = $jogo;
Como $jogo deve estar nulo, não guarda nada.

Eu não entendo nada de PHP, mas parece que tem erro na lógica.

Mas não utiliza a variável $dezenas em nenhum lugar
GOSTEI 0
POSTAR