Único voto en una encuesta mediante IP [PHP]

Iniciado por -sagitari-, 4 Noviembre 2006, 13:00 PM

0 Miembros y 1 Visitante están viendo este tema.

-sagitari-

Hola,

Apenas me voy iniciando en el PHP aunque anteriormente ya había echado mano del PHP, pero la mayoría de veces, haciendo copy/paste sin intención alguna de aprender php...

Bueno, me he bajado una encuesta muy simple (que se guardan los votos en un txt; votos.txt).

Y quiero hacer que solamente una ip pueda hacer un único voto,
me da igual que sea más efectivo que si cookies, que si hacer un sistema de usuarios.... pues yo lo quiero hacer mediante la obtención de la ip.

He probado varias cosas y sin resultado alguno... lo último que he probado ha sido esto:



<?php

$log 
fopen("ip.txt""a");

$ip  $_SERVER['REMOTE_ADDR'];

fwrite($log"".$ip."\n"); 


if (
eregi($ip,$log)) {

echo 
"No puedes volver a votar, ya has votado anteriormente\n";

}

else {


include 
"configuracion.php";

function 
agregaVotacion($voto) { //funcion para agregar el voto
global $archivo;
$leer_votacion fopen($archivo"r");
$tu_voto fread($leer_votacionfilesize($archivo));
fclose($leer_votacion);
$votos split('[|:]'$tu_voto);
for ($i 1$i count($votos); $i $i 2) {
$nombre $i 1;
if ($votos[$nombre] == $voto) {
$votos[$i]++;
}

if ($i == (count($votos) - 1)) {
$act_Voto .= $votos[$nombre] . ":" $votos[$i];
}
else {
$act_Voto .= $votos[$nombre] . ":" $votos[$i] . "|";
}
}

$escribe_archivo fopen($archivo"w");
fputs($escribe_archivo$act_Voto);
fclose($escribe_archivo);
}


function 
mostrar($msgs) { //funcion para mostrar la votación y sus resultados
global $titulo$archivo;

echo "<html>";
echo "<head>";
echo "<title>Resultados</title>";

global $clscr;
echo "</head>";
echo "<body>";


echo "<font face='Tahoma' size='2'>";
$leer_votacion fopen($archivo"r");
$tu_voto fread($leer_votacionfilesize($archivo));
fclose($leer_votacion);
$votos split('[|:]'$tu_voto);
echo "<u><b>Resultados</b></u><br>";

for ($i 1$i count($votos); $i $i 2)
{
$total_votos += $votos[$i];
}

for ($i 1$i count($votos); $i $i 2) {
$nombre $i 1;
if ($total_votos == 0) {
$porcnt 0;
}
else {
$porcnt $votos[$i] / $total_votos 100;
$porcnt round($porcnt1);
}

echo "<br>";
echo "\t$votos[$nombre] -> ";
echo "\t<b>$votos[$i]</b> votos <br>";


if ($porcnt == 0) {
echo "\t<img src=barra.jpg width=$porcnt height=15> <br><b>$porcnt%</b>";
}


else {
echo "\t<img src=barra.jpg width=$porcnt height=15> <br><b>$porcnt%</b> <br>";
}


echo "<br>";
}
echo "Total Votos: <b>$total_votos</b><br>";
if($clscr==1)
{
echo "<a href=javascript:window.close();>Cerrar</a>";
}
else
{
echo "<a href=javascript:history.back(-1);>Volver</a>";
}

if (isset($msgs)) {
echo "$msgs";
}
 
echo "<br>";
echo "</body>";
echo "</html>";
}

if (!isset(
$voto)) {
mostrar("");
exit;
}

agregaVotacion($voto);
mostrar("");

}


?>






Pues resulta que se guarda la ip del votante en ip.txt pero aunque vuelva a votar y la ip sea existente en el ip.txt deja votar las veces que quiera aunque esté la misma ip en ip.txt varias veces...
He probado ya muchas cosas... de alterar los factores de orden... pero no encuentro resultado...

Citar$log = fopen("ip.txt", "a");

$ip  = $_SERVER['REMOTE_ADDR'];

fwrite($log, "".$ip."\n");


if (eregi($ip,$log)) {

echo "No puedes volver a votar, ya has votado anteriormente\n";

}

else {

Con este trozo de código lo que pretendo es:

$log = fopen("ip.txt", "a");
se abre el ip.txt

$ip  = $_SERVER['REMOTE_ADDR'];
indicar que la variable ip almacena la dirección ip del votante

fwrite($log, "".$ip."\n");
se escribe la ip en ip.txt

if (eregi($ip,$log)) {
Aquí echo mano a la función eregi
http://es.php.net/eregi
/ Si la ip del votante está en ip.txt ...

echo "No puedes volver a votar, ya has votado anteriormente\n";
Aparece el mensaje de que no puede volver a votar...

else { ............. }
Y en el caso de que la ip del votante no esté en ip.txt deja votar...


Pero no me funciona.. si me podéis echar un cable.. seguro que tengo algo mal, pero la verdad es que he probado cambiando muchas cosas y siempre no me funciona...

O deja votar siempre sin salir el echo en ningú momento (el caso del código que os he copiado)
O siempre sale el echo dejando votar siempre
O siempre sale el echo sin dejar votar nunca
...


Venga, gracias de antemano ;)

Luisango

#1
lo que podrias hacer es que lo leyera, y que haga:

<?php
str_replace
($REMOTE_ADDR,"");
?>


que lo vuelva a escribir en el txt (hay un modo de fwrite, que ahora no me acuerdo que te borraba todo el archivo y te lo volvia a escribir) y despues que ingrese el voto. No siempre hay que buscar soluciones fijas, algunas veces tienes que hacerlo de otra manera.

De todas formas si tienes una base de datos es muchisimo mas facil y simple. Si tienes una base de datos dimelo que te pongo el codigo vale? ;)

Espero que esto te sirva!
Even better...

-sagitari-

@dmawebmaster
gracias por tu idea, pero es que me gustaría saber qué hago mal, porque tuve un problema parecido al intentar hacer otra cosa, y lo cambié y me quedé con la duda, y entonces, ahora, me gustaría resolver mi problema...

Ya sé que es más fácil con db, pero la gracia es aprender... y entonces quiero hacerlo así, guardándolo en txt para hacerlo un pelín más complejo.

camdark

<?php

$log = fopen("ip.txt", "a");
$cont = fread($log)
$ip  = $_SERVER['REMOTE_ADDR'];

fwrite($log, "".$ip."\n");


if (eregi($ip,$cont)) {aqui sigue contu codigo, lalala

prueba cambiando eso y me avisas

-sagitari-

Cita de: camdark en  4 Noviembre 2006, 16:15 PM
<?php

$log = fopen("ip.txt", "a");
$cont = fread($log)
$ip  = $_SERVER['REMOTE_ADDR'];

fwrite($log, "".$ip."\n");


if (eregi($ip,$cont)) {aqui sigue contu codigo, lalala

prueba cambiando eso y me avisas

No, no funciona
am, y aquí te dejaste ;;
$cont = fread($log);

---

voy a index.php que es donde está el formulario de la encuesta, y entonces, realizo el voto y salen los resultados, pero también este error:

CitarWarning: Wrong parameter count for fread() in /usr/export/www/hosting/user/encuesta/encuesta.php on line 5

y deja votar siempre... aunque la ip salga ya en ip.txt


alone-in-the-chat

#5
puedes probar esto
----------------
$log = fopen("ip.txt", "r");
$ip  = $_SERVER['REMOTE_ADDR'];
while (!feof($log)) {
        $tmp = fgets($log, 4096);
         if ($ip == trim($tmp))
  {
          $flag = "true";
  }else{
          $flag ="false";
  }
}
//aka coloca tu codigo de guardar en tu archivo la ip
y simplementa valida si $flag es verdadero kiere decir que ya voto si es falso no ah votado
Because maybe
You're gonna be the one that saves me
And after all
You're my wonderwall
d[n_n]b

alone-in-the-chat

en realidad no entiendo bien tu logica primero abres el archivo en modo solo escritura ("a")
guardas la ip del visitante....
despues buscas que la ip no este en el archivo??????????????? O.O
si la acabas de guardar de hecho que va a estar y lo mas alucinante es que lo buscas con el eregi pasandole de parametro el gestor del archivo(que abriste en modo escritura osea que el apuntador esta al final del archivo O.O)????????????????????????

....
se ve que de vdd no le das musho al php
Because maybe
You're gonna be the one that saves me
And after all
You're my wonderwall
d[n_n]b

camdark

hopla

cambia el modo "a" por uno que te permita escribir y leer el archivo y se solucionará, pero usa mi codigo
chao