Foros del Web » Programando para Internet » PHP »

Evitar F5 en encuesta

Estas en el tema de Evitar F5 en encuesta en el foro de PHP en Foros del Web. Antes que nada un saludo ojala me pudiesen ayudar con este pequeño script que trata de eliminar una variable para evitar una votacion duplicada recargando ...
  #1 (permalink)  
Antiguo 23/09/2003, 22:21
Avatar de futilidad  
Fecha de Ingreso: julio-2002
Mensajes: 388
Antigüedad: 15 años, 5 meses
Puntos: 0
Evitar F5 en encuesta

Antes que nada un saludo

ojala me pudiesen ayudar con este pequeño script que trata de
eliminar una variable para evitar una votacion duplicada
recargando la pagina.

Esta variable define si se presenta un formulario o se procesan
los resultados de este en una encuesta.

Todo esto dentro de un mismo archivo, el chiste es hacer una
encuesta en la pagina de inicio sobre un artista que les gustaria
cantar y una cancion


inicio.php
Código PHP:
<?
$_GET 
$voto // se recibe la variable voto

if (!isset($voto)) {

// encaso de no venir definida la variable voto se escribe el formulario

echo <<<html
<form name="form1" method="post" action="prueba.php">
  <p>&iquest;Que cancion te gustar&iacute;a cantar?</p>
  <p> 
    <input type="text" name="artista">
    Artista</p>
  <p> 
    <input type="text" name="cancion">
    Canci&oacute;n
  </p>
  <p>
    <input name="voto" type="hidden" value="1">
    <input type="submit" name="Submit" value="Enviar">
  </p>
</form>
html
;
} else {

// en caso de venir definida la variable voto se escribe en la bd

$_GET $artista// recibimos la variable
$artista strtolower($artista); //cambiamos todo a minusculas

$_GET $cancion// recibimos la variable
$cancion strtolower($cancion); //cambiamos todo a minusculas

$host="localhost";
$user="";
$pass="";

// procesamos la informacion dentro de la base de datos
$db=mysql_connect($host,$user,$pass) or die ("Error durante la conexión a la base de datos");
$sql="INSERT INTO encuesta (artista,cancion) VALUES('".$artista."','".$cancion."')";
mysql_db_query("mibasededatos",$sql,$db);
mysql_close();
echo 
"gracias por tu participacion";

//destruimos la variable voto para evitar el recargar la pagina
unset ($voto);

?>
El problema es que al presionar F5 la variable sigue predefinida.
¿ como puedo evitar esto ?

De antemano les agradesco, y si me puediesen hacer
recomendaciones sobre como optimizarian el codigo se los
agradeceria, me serviria para saber como van mis pasos como
aprendiz
  #2 (permalink)  
Antiguo 23/09/2003, 23:26
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 14 años, 7 meses
Puntos: 2
lo suyo es que lo hagas o con sessiones o cookies..., con un simple ejemplo de contador de visitas, puedes hacerlo....

Código PHP:
<?
    $max_cookie_name  
"nombre_de_la_cookie";
    
$max_cookie_value "valor_de_la_cookie";
    
$max_cookie_life  "900";// tiempo de caducidad en segundos


$max_alt 'alt=""';
if(isset(
$_COOKIE["$max_cookie_name"]) && $_COOKIE["$max_cookie_name"] == "$max_cookie_value")
{

echo 
"aqui ya ha votado la encuesta";//aqui el code de cuando ya a votado, solo muestras resultados

}

else

{
  
setcookie($max_cookie_name$max_cookie_valuetime()+$max_cookie_life"");

echo 
"acaba de votar la encuesta";// y aqui el user puede votar

}
?>
__________________
3w.valenciadjs.com
3w.laislatv.com

Última edición por nuevo; 23/09/2003 a las 23:32
  #3 (permalink)  
Antiguo 28/09/2003, 23:19
Avatar de futilidad  
Fecha de Ingreso: julio-2002
Mensajes: 388
Antigüedad: 15 años, 5 meses
Puntos: 0
Muchas Gacias por tu ayuda Nuevo!!
  #4 (permalink)  
Antiguo 30/09/2003, 00:19
Avatar de futilidad  
Fecha de Ingreso: julio-2002
Mensajes: 388
Antigüedad: 15 años, 5 meses
Puntos: 0
Me surgio una duda ya que soy nuevo con las cokies, ¿a que se refiere $max_alt = 'alt=""';?

Gracias
  #5 (permalink)  
Antiguo 03/10/2003, 02:17
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
El problema es que a tu página "prueba.php" han sido enviadas variables de formulario. Al actualizar la página con F5 las variables se vuelven a procesar. Hasta se siguen sumando los votos. Lo que tienes que hacer es una página "proceso.php" que procese las variables del formulario y que te envíe recién a "prueba.php" con header ("location :prueba.php");
Así las variables serán procesadas en "proceso.php" (que el usuario nunca ve) y cuando cargue "prueba.php" ya no tendrá variables procedentes del formulario. Entonces el F5 no actualizará esas variables.
  #6 (permalink)  
Antiguo 03/10/2003, 10:14
Avatar de Phobos  
Fecha de Ingreso: abril-2001
Ubicación: sentado frente a un pc prestado
Mensajes: 375
Antigüedad: 16 años, 7 meses
Puntos: 2
jpinedo, creo que esto es lo mas facil de hacer y no complicarse con las cokies.
  #7 (permalink)  
Antiguo 03/10/2003, 10:29
Avatar de nuevo  
Fecha de Ingreso: mayo-2003
Ubicación: Spain
Mensajes: 2.009
Antigüedad: 14 años, 7 meses
Puntos: 2
y si vuelven hacia atras....? otra vez el mismo voto 2 veces, lo que puedes hacer es usar las dos, cookies y redireccionamiento con header, o meta o java-s, lo que prefieras.

Pd: antes que cookies si tu server lo permite usaria sessiones, con mas comodas a la hora de que le usuario acepte o no cookies.
__________________
3w.valenciadjs.com
3w.laislatv.com

Última edición por nuevo; 03/10/2003 a las 10:57
  #8 (permalink)  
Antiguo 07/10/2003, 23:37
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
De todas maneras...

Bueno futilidad:

Antes te puse qu edeberías hacer una redirección, pero no te puse cómo hacerlo.

De todas maneras te pongo una posibilidad de hacer lo que pides sin utilizar cookies. Además algunos comentarios:

Código PHP:
<?php 
//comprueba si se ha pasado por la url  inicio.php?cargar=resultado
if ($_GET['cargar']=="resultado"){
    
//si existe, entonces quiere decir que ya se votó y que ya se procesó el voto.
    
echo "Gracias por votar";
}else{
    
//si no, se comprueba si se ha pasado por el formulario la variable $_POST['voto'] 
    
if (!$_POST['voto']) {
        
// en caso de no venir definida la variable $_POST['voto'] --->se escribe el formulario
        
echo "<form name=\"form1\" method=\"post\" action=\"post501187.php\">
          <p>&iquest;Que cancion te gustar&iacute;a cantar?</p>
          <p><input type=\"text\" name=\"artista\">Artista</p>
          <p><input type=\"text\" name=\"cancion\">Canci&oacute;n</p>
          <p>
            <input name=\"voto\" type=\"hidden\" value=\"1\">
            <input type=\"submit\" name=\"Submit\" value=\"Enviar\">
          </p>
        </form>"
;
    } else {
        
// en caso de venir definida la variable $_POST['voto'] también estarán definidas $_POST['artista'] y $_POST['cancion']
        
$artista strtolower($_POST['artista']); //cambiamos todo a minusculas
        
$cancion strtolower($_POST['cancion']); //cambiamos todo a minusculas
    
        
$host="localhost";
        
$user="tu_user";
        
$pass="tu_contraseña";
        
$db=mysql_connect($host,$user,$pass) or die ("Error durante la conexión a la base de datos");
        
$sql="INSERT INTO encuesta (artista,cancion) VALUES('".$artista."','".$cancion."')";
        
mysql_db_query("test",$sql,$db) or die (mysql_error());
        
mysql_close();
        
//destruimos la variable voto para evitar el recargar la pagina
        
unset ($voto);
        
//redireccionamos la misma página pero le mandamos (GET) la variable cargar=resultado para que no presente el formulario, sino las gracias.
        
header ("location: post501187.php?cargar=resultado");
    }
};
?>
Y bueno... al recargar la página (F5) ya no habrá problema...

Bueno... hay algunas cositas que creo que no tienes muy claras:

1.-) Si en tu formulario utilizas el método POST (que es lo más común), al recoger las variables, éstas son parte del array $_POST[] y no $_GET[] como estás utilizando tú.... si ves en el código que puse, yo utilizo $_GET[] al principio porque la variable $cargar se ha pasado por URL y no por formulario... El código te funciona porque da lo mismo que pongas $_POST['artista'] que simplemente $artista...
2.-) En las líneas que pones el comentario //recibimos la variable... creo que estás haciendo mal la asignación... "recibir" la variable no es necesario porque puedes utilizar directamente $_POST['artista'] para pasarla por strtolower() tal como puse arriba. Además, en todo caso sería $artista=$_GET y no $_GET=$artista porque el signo= asigna a la variable de la izquierda el valor del de la derecha...

Bueno... nada más... Puedes encontrar harta información sobre por qué utilizar el array $_POST['artista'] o $_GET['artista'] en lugar de simplemente $artista (aunque funcione)... busca en las FAQ's... De hecho casi todo lo que te puse ya está en algún lugar del foro... También puede resultar más práctico utilizar sesiones, pero quise seguir la línea de lo que publicaste porque creo que es más básico y de hecho puede ser didáctico...

saludos
  #9 (permalink)  
Antiguo 07/10/2003, 23:39
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Otra cosa... para Nuevo... Yo probé el código y al volver hacia atrás vuelve a cargar el formulario y no se agrega otro voto
  #10 (permalink)  
Antiguo 08/10/2003, 04:05
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 14 años, 2 meses
Puntos: 41
Josemi puso...

Hola otra vez:
Acabo de leer en otro tema un problema parecido acá cito la respuesta de josemi porque me parece que se aplica y que confirma que al hacer "atrás" no pasa nada si se hace como yo lo puse:

Cita:
Eso es porque todavia el navegador "recuerda" la pagina destino del formulario.

Es caso es igual que cuando uno da a actualizar en la pagina destino de ingresar datos en la base de datos: si lo haces mal, te añade un nuevo registro cada vez que des a actualizar.

El "truco" es no mandar al navegador la pagina de destino del formulario, sino que hacer la accion del formulario (añadir registro, autentificar, ...) y justo despues redireccionar con header("Location"). Asi no le llega al navegador ninguna pagina que sea el destino del formulario, y no sale esa posibilidad de reenviar los datos.
Eso puso josemi en el tema:http://www.forosdelweb.com/s/msg157747.html

Saludos
  #11 (permalink)  
Antiguo 10/10/2003, 02:29
Avatar de futilidad  
Fecha de Ingreso: julio-2002
Mensajes: 388
Antigüedad: 15 años, 5 meses
Puntos: 0
Muchisimas gracias por sus respuestas!!! La verdad han sido de gran ayuda :)
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:45.