-
Contatore visite uniche
Eccomi di nuovo qui :lol:
Stavo cercando di creare un contatore visite in php, che sfrutta un file di testo, fin qua non c'erano problemi, poi però volevo che contasse le visite uniche,cioe se uno visita il sito due volte lo stesso giorno viene contata solo la prima.
Ho provato a usare i cookie, in poche parole il contatore funziona cosi:
se il cookie non esiste, ne crea uno con valore pari al timestamp corrente, se il cookie esiste gia, lo controlla, se è di un giorno piu vecchio della data corrente, aumenta il contatore, altrimenti no.
il mio problema è, mettiamo che uno visita il sito oggi alle 4 di pomeriggio, il contatore aumenta e imposta il cookie a quella data.
giorno sucessivo, 2 di pomeriggio, il contatore non aumenta, eppure è trascorso un giorno, sebbene non siano trascorse precisamente 24h la data e cambiata!
come potrei risolvere il problema?
Ho provato a salvare il giorno in formato numerico nei cookie, per confrontarlo, ma viene automaticamente convertito in formato timestamp vanificando tutto :???:
posto il codice:
Codice PHP:
<?php
// impostazioni di configurazione
$nome_file = 'zzz.php';
$contatore_unico = true; /* valori possibili: true,false impostano se il contatore contera i visitatori unici o le visualizzazioni */
// non modificare nulla oltre questo punto
function controlla_cookie()
{
if (isset($_COOKIE['data_visita']) && time()>($_COOKIE['data_visita']+86400))
{
setcookie('data_visita',time(),time()+86400);
return true;
} elseif (!isset($_COOKIE['data_visita']))
{
setcookie('data_visita',time(),time()+86400);
return true;
} else
return false;
}
$warning = "";
if (@!file_exists($nome_file) or @filesize($nome_file) == 0)
{
$handle = @fopen($nome_file,"w");
if ($handle)
{
@fwrite($handle,'<?php|1|');
@fclose($handle);
$numero_visite = 1;
} else {$warning = 'Impossibile Aprire il file in modalita scrittura. Controllare permessi';}
} else
{
$contenuto = file_get_contents($nome_file);
$arr = explode('|',$contenuto);
if ($contatore_unico)
{
if (controlla_cookie()) $somma = 1; else $somma = 0;
} else $somma = 1;
$handle = @fopen($nome_file,"w");
if ($handle)
{
$nuovo_numero = ($arr[1]+$somma);
@fwrite($handle,"<?php|$nuovo_numero|");
@fclose($handle);
$numero_visite = $nuovo_numero;
} else {$warning = 'Impossibile Aprire il file in modalita scrittura. Controllare permessi';}
}
function contatore($numero_visite,$warning)
{
if (!@isset($warning) or @empty($warning))
echo "$numero_visite";
else
echo "<a href=\"#\" onClick=\"alert('$warning')\">Errore</a>";
}
contatore($numero_visite,$warning);
?>
-
invece di salvare nel cookie il valore di time(), potresti metterci la data come date('Ymd') ad esempio - tralasci ore minuti e secodi, ma confronti solo il giorno.
-
ci ho provato, ma il php prima di salvarlo nei cookie effettua automaticamente la conversione in timestamp e invece di salvare giorno 4 agosto salva il timestamp relativo al 4 agosto...
Me ne sono accorto controllando i cookie
-
no, aspetta, se tu gli dici di salvare in un cookie una stringa, lui ci salva la stringa - non la analizza e converte in qualcos'altro. Insinuo dubbi sul tuo "accorgertene"... riprova :mrgreen:
-
Funziona! :P
Posto la parte del codice da sostituire:
Codice PHP:
function controlla_cookie()
{
if (isset($_COOKIE['data_visita']) && date("d")!=$_COOKIE['data_visita'])
{
setcookie('data_visita',date("d"),time()+86400);
return true;
} elseif (!isset($_COOKIE['data_visita']))
{
setcookie('data_visita',date("d"),time()+86400);
return true;
} else
return false;
}
Non capisco... eppure prima l'ho fatto e nel cookie c'era il timestamp :???:
e mi sa che non lo capiro mai xD
comunque problema risolto, grazie
EDIT: ho un altro problema, ho provato a dare un nome "dinamico" ai cookies in modo che il contatore potesse essere utilizzato, ma sembra non riconoscere le visite uniche,anche se prima funzionava!
ecco il codice:
Codice PHP:
<?php
// impostazioni di configurazione
$contatore_unico = true; /* valori possibili: true,false impostano se il contatore contera i visitatori unici o le visualizzazioni */
// non modificare nulla oltre questo punto
$path_parts = pathinfo($_SERVER['PHP_SELF']);
$nome_file = basename($path_parts['filename']).'.c.php';
function controlla_cookie($nome_file)
{
if (isset($_COOKIE[$nome_file]) && date("d")!=$_COOKIE[$nome_file])
{
setcookie($nome_file,date("d"),time()+86400);
return true;
} elseif (!isset($_COOKIE[$nome_file]))
{
setcookie($nome_file,date("d"),time()+86400);
return true;
} else
return false;
}
$warning = "";
if (@!file_exists($nome_file) or @filesize($nome_file) == 0)
{
$handle = @fopen($nome_file,"w");
if ($handle)
{
@fwrite($handle,'<?php|1|');
@fclose($handle);
$numero_visite = 1;
} else {$warning = 'Impossibile Aprire il file in modalita scrittura. Controllare permessi';}
} else
{
$contenuto = file_get_contents($nome_file);
$arr = explode('|',$contenuto);
if ($contatore_unico)
{
if (controlla_cookie($nome_file)) $somma = 1; else $somma = 0;
} else $somma = 1;
$handle = @fopen($nome_file,"w");
if ($handle)
{
$nuovo_numero = ($arr[1]+$somma);
@fwrite($handle,"<?php|$nuovo_numero|");
@fclose($handle);
$numero_visite = $nuovo_numero;
} else {$warning = 'Impossibile Aprire il file in modalita scrittura. Controllare permessi';}
}
function contatore($numero_visite,$warning)
{
if (!@isset($warning) or @empty($warning))
echo "$numero_visite";
else
echo "<a href=\"#\" onClick=\"alert('$warning')\">Errore</a>";
}
contatore($numero_visite,$warning);
?>