Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

18
respostas

Dúvida PHP

Bom dia a todos! Estou desenvolvendo um sisteminha de votos em PHP baseado nas video aulas...

Quando a pessoa vota o sistema grava um cookie no navegador e grava no banco de dados o IP. Se a pessoa tentar votar novamente ele verifica se o cookie e se o IP está no banco caso as duas ocorrencias sejam verdadeiras e emite a mesagem que a pessoa já votou.

Erro:

Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given in /home/rota1/public_html/sistema/banco-votos.php on line 12

Podem me ajudar? Os arquivos estão abaixo:

index.php

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>A Hora é agora!</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
    <meta name="author" content="Gean Cláudio">
    <link href='https://fonts.googleapis.com/css?family=Oswald' rel='stylesheet' type='text/css'>
    <link href='https://fonts.googleapis.com/css?family=Josefin+Sans:400,400italic,600italic' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" href="css/sistema.css" />
    <link rel="stylesheet" href="css/bootstrap.css" />


</head>

<body>
    <div class="container">
    <?php $ip= $_SERVER['REMOTE_ADDR']; ?>

                <h2 class="text-center" id="y">DILMA SAI OU FICA ?</h2>
                <h3 class="text-center" id="z">Qual a sua opinião?</h3>
                <br/>
        <div class="modela">
            <table class="table table-bordered">

                <form action="processa.php" method="post">
          <input type="hidden" name= "ip" value="<?=$ip?>">

                    <div class="radio">


            <td>
                        <label>
                            <input type="radio" name="voto" id="optionsRadios1" value="sim"> Acho que ela deve FICAR!
                        </label>
                </td>
                <tr>
                    <td>
                        <label>
                            <input type="radio" name="voto" id="optionsRadios2" value="nao"> Acho que ela deve SAIR!
                        </label>
                    </td>
                    <tr>
                        <td>
                            <button type="submit"  class="btn btn-primary">Votar</button>
                        </td>
                        </div>
                        </form>
        </table></div>
    </div>
</body>

</html>

processa.php

<?php
include "conecta.php";
include "banco-votos.php";

 $ip =  $_POST["ip"];
 $ipdaconexao = listaIP($conexao, $ip);
 foreach ($ipdaconexao as $ipbanco) :

if(isset($_COOKIE["gean"]) && ($ip == $ipbanco['id'])) {

  echo "Você ja votou!";
}

  elseif (isset($_POST["voto"])){
  $voto = $_POST["voto"];
  $ip =  $_POST["ip"];
  $latitude = "1";
  $longitude = "1";
  $data = date("d/m/Y");
  $hora = date("H:i");


  if (insereVoto($conexao, $voto, $ip, $latitude, $longitude, $data, $hora)){   setcookie ("gean",$voto,time()+60*60*24*30);
  ?>

    <p class="text-success">Voto computado com sucesso!</p> <?php
    echo $ip;                                                                         

} else {

    $msg = mysqli_error($conexao); ?>
  <p class="text-danger">Voto não computado: <?=$msg?></p> 
<?php
} 
 } endforeach ?>

banco-votos.php

<?php
function insereVoto($conexao, $voto, $ip, $latitude, $longitude, $data, $hora) {

    $query = "insert into votos (voto, ip, latitude, longitude, data, hora) values ('{$voto}', '{$ip}', '{$latitude}', '{$longitude}', '{$data}', '{$hora}')";
    return mysqli_query($conexao, $query);
}

function listaIP($conexao, $ip){
    $ips = array();
    $query = "SELECT ip FROM votos where ip = $ip";
  $resultado = mysqli_query($conexao, $query);
  while($ipp = mysqli_fetch_assoc($resultado)) {
        array_push($ips, $ipp);   
 }
    return $ips;    
}

?>
18 respostas

Oi Gean

nessa linha do banco-votos.php:

$query = "SELECT ip FROM votos where ip = $ip";

experimente colocar a variável $ip entre aspas simples:

$query = "SELECT ip FROM votos where ip = '$ip' ";

pelo que imagino, esse IP está sendo salvo como uma string certo?

Correto Rodrigo! Funcionou! Obrigado! Só uma perguntinha estou querendo pegar os dados de latitude e longitude na index desse script com a API Geolocation do HTML 5, tenho que colocar o código javascript todo no Front para enviar as coordenadas para as variáveis PHP?

Oi Gean

não entendi bem a pergunta, pode me dar um exemplo?

Através da API HTML5 Geoposition :


Quero pegar a latitude e longitude para duas variaveis PHP $latitude e $longitude

Não tem muito como fugir nesse caso, mas você pode deixar o código o menos obstrusivo possível.

Talvez o JS só atribua os valores de latitude e longitude pra alguma parte do seu HTML e lá você atribui pro PHP:

http://php.net/manual/pt_BR/language.variables.external.php

Entendi mas está errado a forma como estou fazendo?

"
<!-- 
    <form action="processa.php" method="post">
          <input type="hidden" name= "ip" value= "<?=$ip?>">"
  <script>

var x = document.getElementById("demo");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function showPosition(position) {

   x.innerHTML = "
          <input type="hidden" name= "latitude" value= ""+ position.coords.latitude +"">"
          <input type="hidden" name= "longitude" value= "" + position.coords.longitude ;"">"


}
</script>
 -->

Oi Gean

É basicamente isso mesmo, mas no lugar de colocar o script no meio do form, você poderia criar ele em um arquivo separado .js e no lugar de fazer:

function showPosition(position) {
    x.innerHTML = "
        <input type="hidden" name= "latitude" value= ""+ position.coords.latitude +"">"
        <input type="hidden" name= "longitude" value= "" + position.coords.longitude ;"">"
}

voc6e deixa os inputs com valor em branco no HTML e edita os dois campos dinamicamente pelo js:

function showPosition(position) {
     $('input[name=latitude]').val(position.coords.latitude);
     $('input[name=longitude]').val(position.coords.longitude);
}

Bom dia Rodrigo, fiz oque você me passou mesmo assim o conteúdo das variáveis latitude e longitude estão indo vazios

 <body onload="getLocation()">

      <div class="container">
    <?php $ip= $_SERVER['REMOTE_ADDR']; ?>

                <h2 class="text-center" id="y">DILMA SAI OU FICA ?</h2>
                <h3 class="text-center" id="z">Qual a sua opinião?</h3>
                <br/>
        <div class="modela">
            <table class="table table-bordered">
           <form action="processa.php" method="post">
          <input type="hidden" name= "ip" value= "<?=$ip?>">"
  <script>

var x = document.getElementById("demo");

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}
}

function showPosition(position) {
     $('input[name=latitude]').val(position.coords.latitude);
     $('input[name=longitude]').val(position.coords.longitude);
}
</script>
    <div class="radio">


            <td>
                        <label>
                            <input type="radio" name="voto" id="optionsRadios1" value="sim"> Acho que ela deve FICAR!
                        </label>
                </td>
                <tr>
                    <td>
                        <label>
                            <input type="radio" name="voto" id="optionsRadios2" value="nao"> Acho que ela deve SAIR!
                        </label>
                    </td>
                    <tr>
                        <td>
                            <button type="submit"  class="btn btn-primary">Votar</button>
                        </td>
                        </div>
                        </form>
        </table></div>
    </div>
</body>

Oi Gean, pode mostrar como ficou o código?

Olá Rodrigo, segue abaixo:

<!-- <form action="processa.php" method="post">
            <input type="hidden" name="ip" value="<?=$ip?>">"
            <script>
              var x = document.getElementById("demo");
              function getLocation() {
                if (navigator.geolocation) {
                  navigator.geolocation.getCurrentPosition(showPosition);
                } else {
                  x.innerHTML = "Geolocation is not supported by this browser.";
                }
              }
              function showPosition(position) {
                $('input[name=latitude]').val(position.coords.latitude);
                $('input[name=longitude]').val(position.coords.longitude);
              }
            </script>
            <div class="radio">
              <td>
                <label>
                  <input type="radio" name="voto" id="optionsRadios1" value="sim"> Acho que ela deve FICAR!
                </label>
              </td>
              <tr>
                <td>
                  <label>
                    <input type="radio" name="voto" id="optionsRadios2" value="nao"> Acho que ela deve SAIR!
                  </label>
                </td>
                <tr>
                  <td>
                    <button type="submit" class="btn btn-primary">Votar</button>
                  </td>
            </div>
          </form>
-->

Gean, gostei da ideia! Mas utilizar o ip público impede de outras pessoas que estão na mesma rede de votar, pois elas compartilham o mesmo ip público! Acredito que utilizar o CPF melhoraria a precisão dos votos.

Olá Rodrigo chegou a ver o código que enviei aqui?

Oi Gean

faltou criar os inputs de longitude e latitude, logo depois do input do IP:

<input type="hidden" name="latitude">
<input type="hidden" name="longitude">

outra coisa é que o JS tem uma função showPosition, mas quem está chamando ela?

Na hora que a pessoa clicar no botão votar chamaria a função e mandaria os valores da latitude e longitude via hidden, mas os valores das variáveis continuam indo vazio, fiz assim, olhe abaixo:

<form action="processa.php" method="post" showPosition(position)>

Está errado?

Oi Gean

Você não pode chamar a função JS dentro da tag do form dessa forma.

Vi que você já chama o showPosition dentro do IF do getPosition:

function getLocation() {
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        x.innerHTML = "Geolocation is not supported by this browser.";
    }
}

Agora voc6e só precisa garantir que esse método vai ser chamado no load da página:

https://learn.jquery.com/using-jquery-core/document-ready/

Bom dia Rodrigo desculpe, mas não entendi bem como vou chamar essa funcão.

Oi Gean

a idéia é que você chame sua function getLocation() no load da página, para que, assim que carregar o HTML, já preencha os campos de longitude e latitude do seu formulário.

Assim, quando você for submeter o form, já terá as informações preenchidas.

Basta colocar um JS no final da sua página fazendo:

$( document ).ready(function() {
    getLocation();
    console.log( "pronto, os campos longitude e latitude já estão preenchidos" );
});