Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Crash_RPM en 18 Junio 2012, 16:36 pm



Título: Problema con este contador
Publicado por: Crash_RPM en 18 Junio 2012, 16:36 pm
Estoy intentando arreglar el contador, porque el contador cuenta bien pero el problema es que cuando se le va la pinza le da por bajar las visitas de un dia para otro, llego a las 100.000 y pico y se bajo a 30.000. A ver si alguien sabe porque pasa esto, y ademas me gustaria hacer que cuente visitas pero por ip o algo porque cuenta por cada clic en la pagina.

En el index.php

Código:
<div id="contador">
                   <span class='negrita'><?php
                        $contador = file('contador.txt');
                        foreach ($contador as $linea)
                            echo $linea;

                    ?> </span>visitas
                </div>

Otro archivo que no se en que momento lo llama, contador_visitas.php

Código:
<?php

//Leo el contador y lo cierro sin escribirlo para que se vacie
        $filename = 'contador.txt';
        $archivo = fopen($filename, 'r+');
        $cont = fread($archivo,20);
        fclose($archivo);

        $cont =$cont+1;

        //Escribo en el contador el valor guardado, +1
        $archivo = fopen($filename, 'w+');
        fwrite($archivo, $cont);
                fclose($archivo);
?>


Título: Re: Problema con este contador
Publicado por: #!drvy en 18 Junio 2012, 17:05 pm
Asi a simple vista.. el fallo que le veo es que le indicas que lea solo 20 bytes del archivo contador.txt

La linea en cuestión es la que aparece en amarillo
Código
  1. <?php
  2. //Leo el contador y lo cierro sin escribirlo para que se vacie
  3.        $filename = 'contador.txt';
  4.        $archivo = fopen($filename, 'r+');
  5.        $cont = fread($archivo,20);
  6.        fclose($archivo);
  7.  
  8.        $cont =$cont+1;
  9.  
  10.        //Escribo en el contador el valor guardado, +1
  11.        $archivo = fopen($filename, 'w+');
  12.        fwrite($archivo, $cont);
  13.                fclose($archivo);
  14. ?>

Puedes simplificarlo algo..

Código
  1. <?php
  2. function contador(){
  3.  // Nombre del archivo
  4.  $archivo = 'visitas.txt';
  5.  // Obtenemos el contenido del archivo
  6.  $visitas = file_get_contents($archivo);
  7.  // Incrementamos el numero de visitas por 1
  8.  (int)$visitas++;
  9.  // Lo guardamos en el archivo
  10.  $handle  = fopen($archivo,'w');
  11.  fwrite($handle,$visitas);
  12.  fclose($handle);
  13.  // Devolvemos las visitas
  14.  return $visitas;
  15. }
  16. ?>

Luego en el index.php lo llamas así:

Código
  1. <div id="contador">
  2.  <span class='negrita'>
  3.  <?php
  4.    // incluimos el archivo contador_visitas.php
  5.    include_once('contador_visitas.php');
  6.    // Imprimimos numero de visitas.
  7.    echo contador();
  8.   ?>
  9.  </span>visitas
  10. </div>



Lo de visitas únicas.. generalmente se suele hacer con bases de datos o archivos en los que se guardan las IP's de los usuarios y luego se comprueban por si existen.. pero con puro fopen es mucho lio. Quizás te interese hacer algo sencillo como poner una cookie al visitante y identificarle por 24 horas y luego volver a contarla..

Ejemplo:
Código
  1. <?php
  2. function contador(){
  3.  // Nombre del archivo
  4.  $archivo = 'visitas.txt';
  5.  // Obtenemos el contenido del archivo.
  6.  $visitas = file_get_contents($archivo);
  7.  // Si NO tiene una cookie llamada visita
  8.  if(empty($_COOKIE['visita'])){
  9.    // Incrementamos el numero de visitas por 1
  10.    (int)$visitas++;
  11.    // Lo guardamos en el archivo.
  12.    $handle  = fopen($archivo,'w');
  13.    fwrite($handle,$visitas);
  14.    fclose($handle);
  15.    // Ponemos la cookie con nombre: visita por 24 horas.
  16.    @setcookie('visita',true,time()+86400);
  17.  }
  18.  // Devolvemos visitas
  19.  return $visitas;
  20. }
  21. ?>


Saludos


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 19 Junio 2012, 12:46 pm
He probado el codigo y si me suma bien, lo unico que no me hace las visitas unicas, yo creo que es algo de las cookies que no las crea bien, porque he probado el mismo codigo en un archivo php que he creado en mi ordenador y accediendo desde localhost si me funciona perfectamente.

El archivo que he creado en el ordenador he puesto todo el codigo en un mismo archivo la funcion contador y la llamada, tiene algo que ver?


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 19 Junio 2012, 15:06 pm
Lo mismo no lo estoy poniendo bien en el index y eso afecta al setcookie.

En el index.php, dentro del body he puesto:

Código:
<div id="contador">
                   <span class='negrita'>
  <?php
     // incluimos el archivo contador_visitas.php
     require_once(LIBRARY_PATH . "/contador_visitas.php");
     // Imprimimos numero de visitas.
     echo contador();
   ?>  
                    </span>
</div>

En el contador_visitas.php que esta dentro de la carpeta resources/library:

Código:
<?php
function contador(){
   // Nombre del archivo
   $archivo = 'contador.txt';
   // Obtenemos el contenido del archivo.
   $visitas = file_get_contents($archivo);
   // Si NO tiene una cookie llamada visita
   if(empty($_COOKIE['visita'])){
     // Incrementamos el numero de visitas por 1
     (int)$visitas++;
     // Lo guardamos en el archivo.
     $handle  = fopen($archivo,'w');
     fwrite($handle,$visitas);
     fclose($handle);
     // Ponemos la cookie con nombre: visita por 24 horas.
     @setcookie('visita',true,time()+86400);
   }
   // Devolvemos visitas
   return $visitas;
}
?>

Sin embargo en el que me he creado de prueba he metido en el body la funcion contador y cuando termina la funcion el echo contador(); y funciona perfectamente.


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 20 Junio 2012, 13:59 pm
Para asegurarme si era por el index, he cojido el php que cree con solo el contador, que si me funcionaba desde localhost, y lo he subido al dominio y hay ya no hace la funcion de visitas reales, cuenta todas las visitas.

¿Donde puede estar el problema? ¿A alguien le ha pasado esto?

Lo mismo es a mi el que no me cuenta como visitas reales, pero seria raro que desde localhost si lo hiciese y desde el dominio no.


Título: Re: Problema con este contador
Publicado por: #!drvy en 20 Junio 2012, 15:54 pm
Código
  1. @setcookie('visita','blabla',time()+86400);

De esa linea quita la @, así te marcara los errores en caso de que los haya.

Quizas es problema del server.


Saludos


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 20 Junio 2012, 16:01 pm
Se la he quitado pero no me marca ningun error, si es problema del server hay algo que se pueda hacer? O solo me quedaria hacer el contador con base de datos?

He estado probando y creo que el problema es del setcookie que no me crea la cookie o lo que sea. He estado buscando un poco y he visto esto "setcookie php falla en php5". ¿Podria ser por esto?


Título: Re: Problema con este contador
Publicado por: #!drvy en 20 Junio 2012, 17:09 pm
Hombre, no hace falta base de datos.. pero es menos complicación yo creo. Puedes hacerlo con un fichero que guarde las IP's y compruebe si existen para una futura visita.

Ejemplo:
Código
  1. <?php
  2. function contador(){
  3.  // Nombre del archivo
  4.  $fichero = 'visitas.txt';
  5.  // Leemos el contenido del fichero
  6.  $handle = fopen($fichero,'r');
  7.  $contenido = fread($handle,filesize($fichero));
  8.  fclose($handle);
  9.  // Separamos visitas de visitas unicas y de las IP's
  10.  $visitas = explode("@",$contenido);
  11.  // Obtenemos la IP del usuario
  12.  $ipU = $_SERVER['REMOTE_ADDR'];
  13.  // Si NO encontramos la IP añadimos visita unica.
  14.  // y Añadimos la ip del usuario
  15.  if(!stristr($visitas[2],$ipU)){
  16.    $visitas[1]++;
  17.    $visitas[2] .= $ipU."|";
  18.  }
  19.  // Añadimos visita por pagina
  20.  $visitas[0]++;
  21.  // Volvemos a guardar el archivo.
  22.  $handle  = fopen($fichero,'w');
  23.  fwrite($handle,$visitas[0]."@".$visitas[1]."@".$visitas[2]);
  24.  fclose($handle);
  25.  // Me limpio de lo feo que soy.
  26.  unset($contenido);
  27.  // Devolvemos las visitas unicas y visitas por pagina
  28.  $visita['pagina'] = $visitas[0];
  29.  $visita['unicas'] = $visitas[1];
  30.  return $visita;
  31. }
  32.  
  33. $visitas = contador();
  34. echo 'Visitas: '.$visitas['pagina'];
  35. echo '<br />';
  36. echo 'Visitas unicas: '.$visitas['unicas'];
  37. ?>

Devolvería algo así:
Código
  1. Visitas: 42
  2. Visitas unicas: 2

PD: La primera vez te dará error porque el fichero estará vació, pero luego ya seguirá ejecutándose normalmente.

Saludos


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 22 Junio 2012, 15:00 pm
El Setcookie me han dicho que no me funciona por la configuracion del php.ini de mi servidor, he estado buscando la opcion que tengo que cambiar del php.ini para que funcione pero no lo encuentro, ¿alguien sabe como configurar el php.ini para que funcione las cookies bien?

drvy gracias por el nuevo contador, me gustaba la idea de las cookies pero si no me va a funcionar probare este nuevo, muchas gracias.


Título: Re: Problema con este contador
Publicado por: #!drvy en 22 Junio 2012, 15:17 pm
Hola,

Que yo sepa, setcookie() no tiene nada que ver con php.ini.

Puedes decirme que te imprime este script en el servidor que usas ?

Código
  1. <?php
  2. if(function_exists('setcookie')){echo 'Existe';}else{echo 'No existe';}
  3. echo '<br />';
  4. setcookie("Prueba", '123');
  5. if(isset($_COOKIE['Prueba'])){echo 'Cookie definida.';}else {echo 'Cookie no definida';}
  6.  

PD: La primera vez te debería dar "Existe y no definida". Recarga la pagina y te debería dar "existe y definida".
Saludos


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 22 Junio 2012, 15:31 pm
Recargo la pagina pero solo me pone:

Existe
Cookie no definida


Título: Re: Problema con este contador
Publicado por: #!drvy en 22 Junio 2012, 16:02 pm
Raro rawo rawo rawisimow xD


Quizás, quizás quizás... probemos definir al ruta de la cookie a ver si funciona.

Código
  1. <?php
  2. setcookie("BLABLABLA",'WTF',time()+3600, '/');
  3. echo '<pre>';
  4. print_r($_COOKIE);
  5. ?>
  6.  

Ábrela, recarga y te debería de salir una lista de cookies. Una de ellas se tiene que parecer a esto "[BLABLABLA] => WTF"

PD: Si sale, es que el servidor te obliga a poner ruta a la cookie.
PD: Si no sale, habla con el soporte técnico de tu servidor y diles que la han cagado con el setcookie(). xD

Saludos


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 22 Junio 2012, 16:14 pm
Pues va a ser que el soporte tecnico la han cagado, recargo y me sale

Array
(
)
 
No salen las demas cookies porque he borrado las cookies antes de recargar ¿Tiene solucion? ¿Si le escribo un correo lo arreglarian? el servidor es Bluehost.

Si no pues pruebo ha hacer el otro contador que me has dicho, pero una duda ¿Que pasaria si entra un usuario con una ip y al dia siguiente entra con la misma ip porque no ha reiniciado el router? ¿No contaria dos visitas no?


Título: Re: Problema con este contador
Publicado por: #!drvy en 22 Junio 2012, 16:44 pm
Citar
¿Si le escribo un correo lo arreglarian?
Pues deberían.. o al menos indicarte como hacerlo para que funcione.

Citar
¿Que pasaria si entra un usuario con una ip y al dia siguiente entra con la misma ip porque no ha reiniciado el router? ¿No contaria dos visitas no??
Nop, teóricamente las visitas únicas son IP's únicas que han visitado tu pagina. Por tanto por muchas veces que la visite con la misma IP contara solo una.


Saludos


Título: Re: Problema con este contador
Publicado por: Crash_RPM en 26 Junio 2012, 00:44 am
Muchas gracias por todo, he hablado con los de blue host  pero al parecer dicen que no es cosa de ellos, que sera el codigo que esta mal pero bueno... espero que solo sea el setcookie y no me falle en mas cosas.

Gracias y espero que estos contadores ya les sirva a otros usuarios.