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...
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í,
$sSQL = "SELECT ip FROM noticias WHERE id = '".$ip."'";
usuario sin login? es tan efectivo como usar una cookie xD
En todo casi si lo que queres evitar es que una misma ip vote dos veces podes hacer:
$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.";
}
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...
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...
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?
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.
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!!