Foros del Web » Programando para Internet » PHP »

Votaciones Limitadas

Estas en el tema de Votaciones Limitadas en el foro de PHP en Foros del Web. Hola amigos, Tengo una pagina que muestra fotos. Muestra una foto y al clickear en ella va a la siguiente foto. Abajo, he colocado la ...
  #1 (permalink)  
Antiguo 02/04/2009, 03:00
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Votaciones Limitadas

Hola amigos,

Tengo una pagina que muestra fotos. Muestra una foto y al clickear en ella va a la siguiente foto.

Abajo, he colocado la opcion de dar 1,2 o 3 votos a cada foto.

El tema es que cada usuario pueda votar una sola vez, tendria que usar Cookies o IP (soy de preferir COOKIES).

Creeis que es problema usar una Cookie por cada Foto Votada? Serian una 30 fotos.
No sobrecarga el explorado? Alguna mejor opcion para votar 1 vez por foto? Gracias!
  #2 (permalink)  
Antiguo 02/04/2009, 03:15
jfw
 
Fecha de Ingreso: enero-2009
Mensajes: 117
Antigüedad: 15 años, 3 meses
Puntos: 3
Respuesta: Votaciones Limitadas

Yo usaría solo una cookie por usuario, y en una entrada de la cookie iría anexando las fotos votadas.
__________________
Buscador de casas rurales en España
  #3 (permalink)  
Antiguo 02/04/2009, 03:16
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Wow. Esa es una solucion perfecta.

Me puedes explicar algo mas acerca de "anexar a una Cookie"? O algun tutorial que explique con ejemplos este tema?

Gracias
  #4 (permalink)  
Antiguo 02/04/2009, 09:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

Pues simplemente lees la cookie y anexas el valor:
Código php:
Ver original
  1. $cookie = $_COOKIE['votos'];
  2. $cookie .= 'otrovalor';
  3. setcookie('votos', $cookie);

Saludos.
  #5 (permalink)  
Antiguo 02/04/2009, 10:14
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Estoy haciéndolo de esta manera, pero no me declara la COOKIE. Siempre me entra en el ELSE. Qué puede ser??
GraciaS!

Fotos.php:
$cookie = $_COOKIE['fotos'];
$cookie .= $row['idFoto'];
if (!isset($_COOKIE['fotos'])) {
include("votacion.php");
}
else{
echo "¡Ya has votado por esta foto!";
}
?>

La COOKIE la declaro en Votando.php:
setcookie("votado", 'set', time()+(60*60*24*7),'/');
  #6 (permalink)  
Antiguo 02/04/2009, 11:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

Tu en tu if preguntas, si no existe $_COOKIE['fotos'] que entre y muestre votacion.php, en caso contrario que muestre el else.

Si la cookie fotos ya existe siempre te va a entrar por el else.

Saludos.
  #7 (permalink)  
Antiguo 02/04/2009, 11:51
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Comprendo, corregido.

El tema es que no sé cómo relacionar el idFoto con la COOKIE, de manera que puedan votar en cada una de las fotos.

Es lo de indexar, pero no entiendo cómo ponerlo y no encuentro nada googleando.

Gracias!
  #8 (permalink)  
Antiguo 02/04/2009, 11:57
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Votaciones Limitadas

Puedes guardar en la cookie los ids concatenados:
1-2-3-15-17
Al recuperarlos, los separas con explode() y con in_array() revisa si el id que el usuario quiere votar ya existe.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #9 (permalink)  
Antiguo 02/04/2009, 12:33
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Gracias David.

Me podrías explicar cómo lo aplico aquí? La verdad que esto de indexar no lo he hecho nunca.
A ver si viéndolo lo comprendo mejor.

Mi campo de la tabla se llama idFoto.

Mil gracias!

$cookie = $_COOKIE['fotos'];
$cookie .= $row['idFoto'];
if (isset($_COOKIE['fotos'])) {
include("votacion.php");
}
else{
echo "¡Ya has votado por esta foto!";
}
?>

La COOKIE la declaro en Votando.php:
setcookie("votado", 'set', time()+(60*60*24*7),'/');
  #10 (permalink)  
Antiguo 02/04/2009, 12:49
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Votaciones Limitadas

El problema es que de esa forma estás guardando un único valor en la cookie, la idea es que cada vez que el usuario vote una foto concatenes esa foto a la cookie.

Después, cuando desees comprobar si ya votó determinada foto, recuperas el valor de la cookie, le aplicas explode() y con in_array() podrás saber si el id que trata de votar ya está en la cookie.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #11 (permalink)  
Antiguo 02/04/2009, 14:13
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Lo comprendo perfectamente, pero no tengo ni idea de cómo concatenar a la hora de Setear la Cookie ni usar el explode.

Me lo podrías poner en código?

Muchísimas gracias!
  #12 (permalink)  
Antiguo 02/04/2009, 14:14
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

Ya te lo puse yo desde el mensaje 4.

Saludos.
  #13 (permalink)  
Antiguo 02/04/2009, 18:21
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

OK.

Me podrías decir si lo he ejecutado bien? Siempre me entra en el IF, incluso aunque no haya votado por esa foto.
GRacias!

Página donde se lleva a cabo el VOTO:
<?php
$cookie = $_COOKIE['votos'];
$cookie .= $_POST['idFoto'];
setcookie('votos', $cookie, time()+(60*60*24*7),'/');
?>

Página con el Formulario:
explode(".", $cookie);
echo $idFoto;
if ($idFoto = $row['idFoto']) {
echo "¡Ya has votado por esta foto!";
}
else{
include("votacion.php");
}
  #14 (permalink)  
Antiguo 02/04/2009, 19:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

Pues tienes ahí algo incorrecto, cuando comparas en un if() tiene que ser con ==, si lo haces con = es asignar.

Saludos.
  #15 (permalink)  
Antiguo 02/04/2009, 19:08
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Ahora solamente me va al ELSE.

Y además, el echo $idFoto; no me devuelve ningún valor.

Tiene pinta de ser un problema en la forma de obtener la parte de la cadena?
  #16 (permalink)  
Antiguo 02/04/2009, 19:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

Pues deberías de verificar donde lees $idFoto, en teoría debes de pasarlo por alguna forma como GET o POST, pero sin ver el código completo es dificil adivinar.

Saludos.
  #17 (permalink)  
Antiguo 02/04/2009, 21:11
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Votaciones Limitadas

Otro problema es que a la hora en que creas la foto no estás concatenando el separador (en este caso el "."). Debe ser:
Código php:
Ver original
  1. $cookie .= $_POST['idFoto'] . '.';
Además, no debes hacer una comparación de igualdad sino usar in_array() para saber si está en el array.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #18 (permalink)  
Antiguo 03/04/2009, 03:04
 
Fecha de Ingreso: noviembre-2008
Mensajes: 259
Antigüedad: 15 años, 4 meses
Puntos: 1
Respuesta: Votaciones Limitadas

Esta es la situacion actual porque no funciona de ninguna manera.

Tengo una pagina que muestra una FOTO (que viene del idFoto de una tabla).
En esa misma pagina tengo este codigo, que muestra el archivo para votar en caso de que esa foto no haya sido votada antes (o deberia hacerlo pero no lo hace!!).

Foto.php
-------------------------------
explode(".", $cookie);
echo $idFoto; // No me esta devolviendo nada!!!
if ($idFoto = $row['idFoto']) {
echo "¡Ya has votado por esta foto!";
}
else{
include("votacion.php");
}


Cuando el usuario vota, vamos a una pagina llamada Votando.php donde se inserta el voto en la tabla. Aqui se da de alta la Cookie.
Votando.php
--------------------------------------
$cookie = $_COOKIE['votos'];
$cookie .= $_POST['idFoto'] . '.';
setcookie('votos', $cookie, time()+(60*60*24*7),'/');

Ayuda!!!
  #19 (permalink)  
Antiguo 03/04/2009, 09:40
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

Pues son los mismos errores que te comente yo y David el Grande, cuando usas un if() para comparar debes de usar == para comparar, aunque en tu caso como bien te expuso David, si vas a guardar múltiples registros debes de usar in_array.

Por otro lado si ves en tu código usas explode('.', $cookie); pero no lo asignas a nada...

Saludos.
  #20 (permalink)  
Antiguo 03/04/2009, 09:46
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Votaciones Limitadas

Tu comparación sigue mal. Estás usando una asignación (=) en lugar de una comparación (==), además, como he dicho en mensajes anteriores, en este caso no debes hacer una comparación de igualdad, sino usar in_array. Y si te fijas, el resultado de explode no lo estás almacenando en ningún lado. Un ejemplo sería:
Código php:
Ver original
  1. $votados = $_COOKIE['votos'];
  2. $ids = explode('.', $votados);
  3. if (in_array($id_de_la_foto_a_votar, $ids)) {
  4.     // Votado
  5. } else {
  6.     // No Votado
  7. }
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #21 (permalink)  
Antiguo 03/04/2009, 18:39
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Respuesta: Votaciones Limitadas

sobre este mismo tema pero pensando a lo grande. Imaginad una web estilo Meneame, con 10.000.000 de noticias y otros tantos usuarios ¿como guardar todos los votos? está claro que en MySQL pero no se creará una monstruosidad de bbdd?

saludos
  #22 (permalink)  
Antiguo 03/04/2009, 20:58
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

MySQL no tiene ningún problema con esa carga de datos.

Saludos.
  #23 (permalink)  
Antiguo 03/04/2009, 22:07
 
Fecha de Ingreso: enero-2004
Mensajes: 207
Antigüedad: 20 años, 3 meses
Puntos: 1
Respuesta: Votaciones Limitadas

MySQL no, pero tu hosting igual sí, a no ser que estés dispuesto a pagar bastante. Me refería más bien a este respecto.
  #24 (permalink)  
Antiguo 03/04/2009, 22:21
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Votaciones Limitadas

El caso es que guardes donde los guardes (ya sea en una base de datos, archivos planos :, etc.), los votos de 10.000.000 de noticias ocuparán espacio, y por lo tanto, habrá problemas con el hosting .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #25 (permalink)  
Antiguo 03/04/2009, 22:30
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Votaciones Limitadas

En efecto, por eso siempre es dependiendo de la carga del sitio ir viendo un servidor dedicado para una aplicación de ese tamaño.

Saludos.
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 21:48.