Problema con este contador

Iniciado por Crash_RPM, 18 Junio 2012, 16:36 PM

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

Crash_RPM

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

<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

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

#!drvy

#1
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 (php,5) [Seleccionar]
<?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);
?>


Puedes simplificarlo algo..

Código (php) [Seleccionar]
<?php
function contador(){
  
// Nombre del archivo
  
$archivo 'visitas.txt';
  
// Obtenemos el contenido del archivo
  
$visitas file_get_contents($archivo);
  
// Incrementamos el numero de visitas por 1
  
(int)$visitas++;
  
// Lo guardamos en el archivo
  
$handle  fopen($archivo,'w');
  
fwrite($handle,$visitas);
  
fclose($handle);
  
// Devolvemos las visitas
  
return $visitas;
}
?>


Luego en el index.php lo llamas así:

Código (html4strict) [Seleccionar]
<div id="contador">
 <span class='negrita'>
 <?php 
    
// incluimos el archivo contador_visitas.php
    
include_once('contador_visitas.php'); 
    
// Imprimimos numero de visitas.
    
echo contador(); 
   
?>

 </span>visitas
</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 (php) [Seleccionar]
<?php
function contador(){
  
// Nombre del archivo
  
$archivo 'visitas.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;
}
?>



Saludos

Crash_RPM

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?

Crash_RPM

#3
Lo mismo no lo estoy poniendo bien en el index y eso afecta al setcookie.

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

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

<?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.

Crash_RPM

#4
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.

#!drvy

Código (php) [Seleccionar]
@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

Crash_RPM

#6
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?

#!drvy

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 (php) [Seleccionar]
<?php
function contador(){
  
// Nombre del archivo
  
$fichero 'visitas.txt';
  
// Leemos el contenido del fichero
  
$handle fopen($fichero,'r');
  
$contenido fread($handle,filesize($fichero));
  
fclose($handle);
  
// Separamos visitas de visitas unicas y de las IP's
  
$visitas explode("@",$contenido);
  
// Obtenemos la IP del usuario
  
$ipU $_SERVER['REMOTE_ADDR'];
  
// Si NO encontramos la IP añadimos visita unica.
  // y Añadimos la ip del usuario
  
if(!stristr($visitas[2],$ipU)){
    
$visitas[1]++;
    
$visitas[2] .= $ipU."|";
  }
  
// Añadimos visita por pagina
  
$visitas[0]++;
  
// Volvemos a guardar el archivo.
  
$handle  fopen($fichero,'w');
  
fwrite($handle,$visitas[0]."@".$visitas[1]."@".$visitas[2]);
  
fclose($handle);
  
// Me limpio de lo feo que soy.
  
unset($contenido);
  
// Devolvemos las visitas unicas y visitas por pagina
  
$visita['pagina'] = $visitas[0];
  
$visita['unicas'] = $visitas[1];
  return 
$visita;
}

$visitas contador();
echo 
'Visitas: '.$visitas['pagina'];
echo 
'<br />';
echo 
'Visitas unicas: '.$visitas['unicas'];
?>


Devolvería algo así:
Código (url) [Seleccionar]
Visitas: 42
Visitas unicas: 2


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

Saludos

Crash_RPM

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.

#!drvy

#9
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 (php) [Seleccionar]
<?php
if(function_exists('setcookie')){echo 'Existe';}else{echo 'No existe';}
echo 
'<br />';
setcookie("Prueba"'123');
if(isset(
$_COOKIE['Prueba'])){echo 'Cookie definida.';}else {echo 'Cookie no definida';}


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