fazer dois testes antes de gravar no banco

Enviada por Neto Sales 
Neto Sales
fazer dois testes antes de gravar no banco
17 de January de 2019 às 03:19AM
Dúvida do PHP com mysql:
Tenho uma rotina em php que está funcionando, gravando os dados numa tabela. Agora surgiu a necessidade de fazer dois testes antes da gravação, e eu não estou conseguindo ter idéia de como fazer, por isso vou postar no próprio código pra ver se entendem. O primeiro teste, é ver se o número escolhido, já foi selecionado (variável numero), e caso isso ocorra, não gravar. O outro teste é impedir que o mesmo usuário (usuário apostador)faça mais de uma aposta. Segue código:

<?php
require_once 'init.php';
// pega os dados do formuário
$data_hora = isset($_POST['data_hora']) ? $_POST['data_hora'] : null;
$apostador = isset($_POST['apostador']) ? $_POST['apostador'] : null; // quero que esse apostador não se repita. Se já estiver na tabela, avisar e sair.
$telefone = isset($_POST['telefone']) ? $_POST['telefone'] : null;
$numero = isset($_POST['numero']) ? $_POST['numero'] : null; // quero que cheque esse número na tabela existente, e caso exista, retornar para inserir outro.


// validação (bem simples, só pra evitar dados vazios)
if (empty($data_hora) || empty($apostador) || empty($telefone) || empty($numero))
{
echo "Volte e preencha todos os campos";
exit;
}
$hoje = date("d-m-Y H:i");
$limite = ('08-03-2019 16:35');
if (strtotime($hoje) >= strtotime($limite)){
echo "Esgotado o horario limite. Aguarde para o próximo sorteio!";
exit;
}

// a data vem no formato dd/mm/YYYY
// então precisamos converter para YYYY-mm-dd

// insere no banco
$PDO = db_connect();

// Acredito que esse teste deva ser feito aqui, antes de gravar, mas é só um palpite, pois tô mais perdido do que padre (alguns) em boate

//verificar se apostador e numero já existem na tabela, e caso exista, retornar o fluxo



$sql = "INSERT INTO palpites(data_hora, apostador, telefone, numero) VALUES(:data_hora, :apostador, :telefone, :numero)";
$stmt = $PDO->prepare($sql);
$stmt->bindParam(':data_hora', $data_hora);
$stmt->bindParam(':apostador', $apostador);
$stmt->bindParam(':telefone', $telefone);
$stmt->bindParam(':numero', $numero);


if ($stmt->execute())
{
header('Location: index.php');
}
else
{
echo "Erro ao cadastrar";
print_r($stmt->errorInfo());
Trambulhao
Re: fazer dois testes antes de gravar no banco
14 de February de 2019 às 10:26PM
No exemplo abaixo, fiz a verificação no banco de dados do número escolhido juntamente com o nome do apostador somente como demonstração. O correto seria registar também o momento(datatime) da aposta. Só assim você consegue impedir que uma pessoa aposte duas vezes num mesmo sorteio.


<?php

require_once 'init.php';

$data_hora = filter_input(INPUT_POST, 'data_hora');
$apostador = filter_input(INPUT_POST, 'apostador');
$telefone = filter_input(INPUT_POST, 'telefone');
$numero = filter_input(INPUT_POST, 'numero', FILTER_VALIDATE_INT);

// VERIFICAÇÃO

if (empty($data_hora) || empty($apostador) || empty($telefone) || is_numeric($numero)) {
echo "Volte e preencha todos os campos";
exit;
}

$hoje = date("d-m-Y H:i");
$limite = ('08-03-2019 16:35');

if (strtotime($hoje) >= strtotime($limite)) {
echo "Esgotado o horario limite. Aguarde para o próximo sorteio!";
exit;
}

$PDO = db_connect();

// Verificação feita em conjunto no banco de dados. Se o número e/ou o nome do apostador existir no banco de dados,
// para aqui e lança a mensagem.
$checkDB = $PDO->prepare("SELECT numero, apostador FROM palpites WHERE numero = ? OR apostador = ?");
$checkDB->execute([$numero, $apostador]);

if (!empty($checkDB->fetch(PDO::FETCH_BOTH))) {
echo 'Você já realizou sua aposta ou o número ', $numero, ' já foi escolhido!';
exit;
}

$sql = "INSERT INTO palpites (data_hora, apostador, telefone, numero) VALUES(?, ?, ?, ?)";
$stmt = $PDO->prepare($sql);
$resultado = $stmt->execute([$data_hora, $apostador, $telefone, $numero]);

if ($resultado) {
header('Location: index.php');
}
else {
echo "Erro ao cadastrar";
//print_r($stmt->errorInfo()); // Nunca expõem os erros na tela em modo de produção
}
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.