Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: -sagitari- en 4 Noviembre 2006, 13:00 pm



Título: Único voto en una encuesta mediante IP [PHP]
Publicado por: -sagitari- en 4 Noviembre 2006, 13:00 pm
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:


Código:
<?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_votacion, filesize($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_votacion, filesize($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($porcnt, 1);
}

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 ;)


Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: Luisango en 4 Noviembre 2006, 13:12 pm
lo que podrias hacer es que lo leyera, y que haga:
Código:
<?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!


Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: -sagitari- en 4 Noviembre 2006, 13:17 pm
@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.


Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: 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


Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: -sagitari- en 4 Noviembre 2006, 16:51 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 ;;
Código:
$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:

Citar
Warning: 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



Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: alone-in-the-chat en 4 Noviembre 2006, 17:42 pm
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


Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: alone-in-the-chat en 4 Noviembre 2006, 17:48 pm
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


Título: Re: Único voto en una encuesta mediante IP [PHP]
Publicado por: camdark en 4 Noviembre 2006, 19:10 pm
hopla

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