[Ayuda] Comprobar si usuario voto

Iniciado por wirelesswifi, 30 Octubre 2010, 00:39 AM

0 Miembros y 2 Visitantes están viendo este tema.

wirelesswifi

Buenas, tengo este codigo:

//Comprobar si usuario voto.
$ip = $_SERVER['REMOTE_ADDR'];

if(mysql_query("SELECT ip FROM noticias WHERE id LIKE '%$ip%'")){
   
echo "Gracias por votar.";

}else{
   
echo "Usted ya ha votado.";  
}


Ok, cuando pulso el boton Votar va a votar.php donde tengo el codigo de arriba, luego me sale:

Gracias por votar.

Todo bien hay.

Pero cuando pulso de nuevo Votar sigue votando y sumando votos en la id de la noticia.

Ya registra la IP en la id de la noticia que es IP el campo.

Pero sigue votando cuando pulso Votar, que estara mal en el codigo de arriba?

Espero me ayuden

Saludos...

Shell Root

#1
Ando un poco borrachín, así que puede ser una estupidez lo que voy a poner, pero...

Se supone qué el código que tienes hace lo siguiente, Si se realiza correctamente la sentencia SQL, entonces mostrar 'Gracias por votar.' de lo contrario mostrar 'Usted ya ha votado.'

Observaciones:
1. No veo donde se realiza el ingreso de la dirección IP a la base de datos (Clausula INSERT)
2. Considero que la QUERY debería ser así,
Código (php) [Seleccionar]
$sSQL = "SELECT ip FROM noticias WHERE id = '".$ip."'";
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

Nakp

usuario sin login? es tan efectivo como usar una cookie xD
Ojo por ojo, y el mundo acabará ciego.

[u]nsigned

En todo casi si lo que queres evitar es que una misma ip vote dos veces podes hacer:

Código (php) [Seleccionar]
$ip = $_SERVER['REMOTE_ADDR'];
$result = mysql_query("SELECT ip FROM noticias WHERE id='".$ip."' LIMIT 1");
if(!mysql_num_rows($result)){
   echo "Gracias por votar.";
}else{
    echo "Usted ya ha votado.";   
}

No hay atajo ante la duda, el misterio se hace aquí...
Se hace carne en cada uno, el misterio es existir!

wirelesswifi

Cita de: Nakp en 30 Octubre 2010, 02:52 AM
usuario sin login? es tan efectivo como usar una cookie xD


Como seria por cookie Nakp

Gracias Shell Root y unsigned, lo que pasa es que las ips las guardo por comas.

Un ejemplo:

190.265.157.154,190.657.12.647 y asi por cada noticia. No por row

Gracias igual

Saludos...

tragantras

puedes hacer un select de las ips asociadas a la noticia, luego, haces un explode() según las comas (,) y con un foreach recorres el array buscando la ip!

o directamente haces el select de las ips asociadas a la noticia y buscas la subcadena ip dentro de la ristra de ips con strstr()

de todas formas, la logica if-else que has seguido es incorrecta, sería todo lo contrario, además select devuelve false cuando se ha producido un error, deberías pasarselo a mysql_num_rows como apuntaban por ahi arriba

el uso de cookies yo no lo pondría, pueden borrar la cookie y votar mil veces, o directamente no aceptar las cookies y hacer magia...
Colaboraciones:
1 2

Shell Root

Cita de: wirelesswifi en 30 Octubre 2010, 04:20 AM..., lo que pasa es que las ips las guardo por comas.
What the fuck?. Entonces para qué el motor de base de datos?
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

wirelesswifi

Cita de: tragantras en 30 Octubre 2010, 12:17 PM
puedes hacer un select de las ips asociadas a la noticia, luego, haces un explode() según las comas (,) y con un foreach recorres el array buscando la ip!

o directamente haces el select de las ips asociadas a la noticia y buscas la subcadena ip dentro de la ristra de ips con strstr()

de todas formas, la logica if-else que has seguido es incorrecta, sería todo lo contrario, además select devuelve false cuando se ha producido un error, deberías pasarselo a mysql_num_rows como apuntaban por ahi arriba

el uso de cookies yo no lo pondría, pueden borrar la cookie y votar mil veces, o directamente no aceptar las cookies y hacer magia...

Si, es mejor por mysql_num_rows entonces crearia una tabla llamada votos con los campos id_noticia e IP.

Luego en el PHP de votos guardaria la IP de cada noticia en el campo IP y la ID de la noticia.

Todo bien, pero como haria para mostrar los votos en cada noticia los que ya votaron por mysql_num_rows?

Gracias por la ayuda

Disculpa haberlos molestado

Saludos.

juancho77

Sin ofender, pero estas tratando de empezar a manejar sin andar en bici primero.

Una solución bastante elegante seria decir:
Una noticia tiene cero o mas votos. Un usuario puede votar cero o mas noticias, pero cada noticia una sola vez.
Entonces agarras tu base de datos y creas una tabla que se llame news_vote o algo asi, que tenga campos ID, IP, ID_NOTICIA.
La sentencia SQL te queda algo asi:

"SELECT * FROM NEWS_VOTES WHERE IP=ip del usuario AND ID_NOTICIA=identificador de la noticia que se quiere votar"
(hace mucho que no uso raw sql, seguro que a lo de arriba le faltan comillas y eso)

Esa sentencia te devuelve un ResultSet, un objeto con las filas de resultado.
La funcion mysql_num_rows() lo unico que hace es contar el numero de resultados obtenidos. Lo que vos tenes que hacer es decir

si mysql_num_rows()>0 entonces YA HA VOTADO, sino GRACIAS POR VOTAR.

Eso de anotar todas las ips separadas por coma es imposible de mantener sencillo y una implementacion muy mala. Creeme que una tabla con 100 filas o una con 1000 se procesan casi en el mismo tiempo.

Tanto la implementacion con Cookies como usando la variable REMOTE_ADDR son malas por el hecho que son "fakeables". Todo es fakeable digamos, pero tener un user system es mucho mas fuerte que usar ip. Ademas, gran parte de los usuarios usan ips aleatorias dinamicas asi que te estarian engañando sinb darse cuenta.

Para mostrar los votos de cada noticia no usas mysql_num_rows()!!!! Haces un select where id_noticia=noticia!!