Erro ao comparar conteudo do Array com BD em PHP
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
Curtidas 0
Respostas
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
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