Autor Tema: Evitar volver atrás página PHP en sistema de votación si usuario ya ha votado  (Leído 3540 veces)

reenurya

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 4
    • Ver Perfil
Cordial saludo.

Tengo un sistema de votaciones hecho en PHP y utilizando la librerìa mysql (sí, se que ya no se usa pero por problemas con el CMS y por tiempo debo implementarlo así). En la página validar.php decide si un asociado de una empresa ya votó (controlado con una columna val_voto que es tinyint) y si no lo ha hecho, le permite seleccionar de una lista o select de html. Una vez ha votado, se carga otra pàgina que confirma el voto y hace los UPDATES correspondientes (votar.php)

EL problema es que en esta pàgina (votar.php) si el asociado ya votò y vuelve hacia atrás en el navegador, puede votar nuevamente, lo cual es un error dado que sólo puede votar una vez y no ha valido ni funciones de javascript ni borrar la cachè de la página. Anexo los códigos en espera de que alguien me pueda ayudar dado que tengo que entregar este sistema y soy muy novato en php.

valida.php
Código: [Seleccionar]
<style type="text/css">
  label { color: black; font-family: Verdana; text-align: center;}
 
  .centrado{
margin:10px auto;
display:block;
text-align: center;
    }
    H2 { color: black; font-family: Verdana; text-align: center;}
       
    input{
        color: black;
        font-family: Verdana;
      text-align: center;
    }
</style>
<script languaje="javascript">
    function funcion_javascript(){
        alert ("Estimado(a) asociado(a), su voto ya ha sido registrado o ha ingresado mal los datos, favor verif赤quelos e ingrese nuevamente.");
        location.href ="http://www.mipaginaweb.com";
    }
    function nodatos(){
        alert ("Los datos que han ingresado no son correctos, favor ingrese nuevamente");
        location.href ="http://www.mipaginaweb.com/inicio.php";
    }
    function voto(){
        alert ("Estimado(a) asociado(a), su voto ha sido registrado. Gracias por participar");
        location.href ="http://www.mipaginaweb.com";
    }
</script>
<div>
    <img class="centrado" src="logo.png" alt="">
    <h2>LISTADO DE CANDIDATOS A DELEGADOS DE SU ENTIDAD</h2>
</div>
<?php
header
("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0"false);
header("Pragma: no-cache");
//conecta a la base de datos
require 'bd.php';  
//se obtienen los datos de un formulario anterior
    $idasoc $_POST['id'];
    $anio $_POST['anio'];
    $mes $_POST['mes'];
    $dia $_POST['dia'];
    $fn $anio."-".$mes."-".$dia;
//consulta que valida si el votante ya votó (val_voto es un tinyint)
        
$ver_votomysql_query("select val_voto from aa_asoc_votan_ent where id_asoc='".$idasoc."'",$serv);
$row mysql_fetch_assoc($ver_voto);
$var$row['val_voto'];
//Valida si la variable var es 'true' y si es asì alerta al asociado y se devuelve a la pàgina inicio.php
if ($var == '')

?>
<script languaje="javascript"> funcion_javascript(); </script> <?php
            
}
//si la variable var es 'false', carga el select
            
else
        {
//Obtiene un código de empresa para listar los candidatos disponibles
$consulta2 mysql_query("SELECT cod_empresa FROM aa_asoc_votan_ent WHERE id_asoc='".$idasoc."'",$serv); 
    while ($row mysql_fetch_array($consulta2))
    {
               $cod_ent $row['cod_empresa']; 
    }
//Consulta que obtiene el listado de los candidatos según la empresa y los carga en un select de html
$consulta3 mysql_query("SELECT iddeleg, nombre FROM aa_delegados WHERE cod_empresa='".$cod_ent."'",$serv); 
?>

                        <div class="centrado">
                            <form method='post' action='votar.php' id="form1">
                                <div>
                            <select name="delegados" autocomplete="off">
                            <option>Seleccione un delegado...</option>
                                        <?
                                            while($row = mysql_fetch_array($consulta3))
                                            {
                                                echo "<option value=".$row['iddeleg'].">".$row['nombre']."</option>";
                                            }
                                        ?>
                                    </select>
                                </div>
                        <div>
                            <input type='submit' name='submit' value='Votar'onsubmit='voto()'>
<!--envía un input oculto con un valor de identificaciòn de asociado para comprobar en votar.php-->
                            <input type='hidden' name='id' value='<?php echo htmlspecialchars($idasoc); ?>' >
                        </div>
                        </form>
                    </div>
<?php
                    
}
//si no hay datos de candidatos que pueda votar el asociado o son incorrectos.                    
                    
else
                    {
                        if(
$filas ==0)
                        {
                            
?>
<script languaje="javascript"> nodatos(); </script>
                        <?php
                        
}
                    }
            }

votar.php
Código: [Seleccionar]
<script type="text/javascript">
window.onload=function(){
Objeto=document.getElementsByTagName("a");
for(a=0;a<Objeto.length;a++){
Objeto[a].onclick=function(){
location.replace(this.href);
return false;
}
}
}
javascript:window.history.forward(1);

function deshabilitaRetroceso(){
    window.location.hash="no-back-button";
    window.location.hash="Again-No-back-button" //chrome
    window.onhashchange=function(){window.location.hash="no-back-button";}
}

function voto(){
   alert ("Estimado(a) asociado(a), su voto ha sido registrado. Gracias por participar");
   location.href ="http://www.feser.com.co";
}
</script>

<html>
 
<?
require 'bd.php';
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
//trae datos de valida.php
    $idd = $_POST['id'];
    $votado = $_POST['delegados'];

 
//Suma un voto al candidato
$consulta4 = mysql_query("UPDATE aa_delegados SET votos=votos+1 where cedula ='".$votado."'",$serv);
//Establece valor de true a la columna val_voto, es decir que el asociado ya votó-
$consulta5 = mysql_query("UPDATE aa_asoc_votan_ent SET valida_voto='true' where cedula ='".$cced."'",$serv);

//si ya votó
$variable = 'true';
if ($variable){
?>
<script languaje="javascript">
voto();
deshabilitaRetroceso();
</script>
<?
}

?>   

</body>
</html>
« Última modificación: 12 de Junio 2018, 18:59 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, tal y como yo lo entiendo, el problema estaría en cómo se hace la validación de que el asociado haya votado.

Supongamos que tienes como página inicial validar.php donde se comprueba si el asociado ya ha votado o no, y en caso de no haber votado le muestra un desplegable para que elija opción y se pasa a la siguiente página (votar.php).

Con ese diseño, no tienes forma de impedir que se use el botón de vuelta atrás y vuelva a votar. Tampoco tendrías forma de impedir que el usuario invocara la url de votar.php pasándole a esta url los datos que le diera la gana. Para impedirlo, tienes que introducir la validación de si el usuario ha votado ya tanto en la página validar.php como en la página votar.php, es decir, tienes que hacer la comprobación dos veces.

La idea sería:

En validar.php: si el usuario no ha votado, se le muestra el desplegable y se le permite votar.

En votar.php: si el usuario no ha votado, se guardan los datos de la votación y se muestra un mensaje de confirmación.

Supongamos ahora opciones:

Un usuario vota y sale de la web: no hay problema.

Un usuario entra en validar.php y no ha votado, vota, le da al botón retroceso y vuelve a votar. Al llegar a votar.php y hacer la comprobación de si ha votado o no se comprobará que ya ha votado, por lo que debería aparecerle un mensaje indicándole "Lo sentimos. Su voto ya está registrado y no es posible votar dos veces".

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".