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" );
});