Erro ao comparar conteudo do Array com BD em PHP
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:
<?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
Clique aqui para fazer login e interagir na Comunidade :)