La única forma de evitar que alguien vote más de una vez es tener un sistema de autentificación con usuarios registrados y guardar en la BD (o txt) las encuestas por las que ya votó...
Lo que dice en las FAQ's y el código que te puso nuevo sirve para que un mismo usuario* no pueda votar en la misma encuesta dentro de las próximas 24 horas... O sea que mañana regresa y vuelve a votar...
*El problema es se toma en cuenta como que votó el ordenador, no el usuario. O sea que si yo voto ahora.. nadie más que utilice esta máquina puede votar (en 24 horas)... El mismo problema se tendría utilizando cookies en lugar de sesiones.
Ahora... algo que no contempla el código de nuevo, es que un usuario vote por varias encuestas en la misma sesion. Por eso creo que $_SESSION['id_encuesta'] debería ser un array. O sea algo así:
Código PHP:
<?php
session_name('tu_nombre');//pon un nombre a la session
session_start();//inicio sessiones
session_cache_limiter('nocache,private');//regulo la cache, para no dar error
ini_set("session.cache_limiter","86400");//las sessiones caducan cada 24h
if (empty($_SESSION['id_encuesta'])){//si el dato de la session esta vacio, ejecuta if
//Acá añades el voto: UPDATE tabla SET... etc, etc
//aqui ejecutas el +1 en la encuesta
$_SESSION['id_encuesta'][]= $_GET['id'];//añadimos un dato como que ya ha votado
//E imprimes el mensaje:
echo "Se acaba de votar...";
} else {//si el array existe...
//Recorremos el array buscando alguna coincidencia entre las encuestas votadas en esta
//sesión y la que se pretende votar ahora.
$encontrado=0;
foreach($_SESSION['id_encuesta'] as $valor){
if($valor==$_GET['id']){//Si se encuentra coincidencia es que ya se votó en esta encuesta
$encontrado=1;
break;
}
}
if($encontrado=1){
echo "Usted ya había votado en esta...";
}else{
//Añades el voto: UPDATE tabla SET...
//Guardas el id de la encuesta en el array (sesion)
$_SESSION['id_encuesta'][]= $_GET['id'];
//E imprimes el mensaje:
echo "Se acaba de votar...";
}
}
?>
Saludos