Fórum Erro ao comparar conteudo do Array com BD em PHP #620337
04/08/2023
0
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | <?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
Curtir tópico
+ 0
Responder
Posts
04/08/2023
Arthur Heinrich
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
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
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)