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