Si, funziona, ho provato a togliere il cookie.
Ho notato una cosa, nel db scattano 2 visite alla volta, invece di una.
perche' nel sito hai un redirect che si vede pure a occhio nudo (la pagina si carica due volte)
gruppoalveo.it carica correttamente
www.gruppoalveo.it trasferisce gruppoalveo.altervista.org che trasferisce a gruppoalveo.it
who knows :)
ma puoi sempre filtrare le visite a distanza di 1sec, per esempio o sistemare meglio il redirect del dominio
l'unica cosa certa è che non è colpa di isbot :P
Allora mettiamoci un secondo alle visite, che modifico?
Facendo prove ho visto che se è attivo il cookie nel mio pc, non fa passare nemmeno gli ip dei visitatori, forse c'è qualche conflitto.
Codice PHP:
<?php
function isBot() {
$agent = $_SERVER["HTTP_USER_AGENT"];
$ip = $_SERVER['REMOTE_ADDR'];
//$ip = "751.86"; // <--- DOPO TOGLILO
//In alcuni ip dinamici cambia solo l'ultima parte, perciò si scrivono così, es. ip pc-ospite: 107.170.56 in $bot si scrive 107.170.
$bot = array("googlebot","spider","crawler","scooter","yahoo! slurp","la_archiver","lycos","teoma_agent","ask jeeves","mercator","fast","msnbot","bingbot","facebookexternalhit",
"192.187.100.154","107.170.","213.42.176.216","38.99.82.","162.243.","104.131.217.168");
foreach ($bot as $item) {
if ( stripos($agent, $item) > -1 ) {
return TRUE;
}
if ( stripos($ip, $item) > -1 ) {
return TRUE;
}
}
return FALSE;
}
//$controllo = isBot(); // <--- DOPO TOGLILO
//if($controllo){echo 'è un ip';} // <--- DOPO TOGLILO
//else{echo 'non è un ip';} // <--- DOPO TOGLILO
//Mette i dati nel DB e aumenta il contatore ad ogni visita
function contatore($pagina) {
//RICORDA di memorizzare l'url cookie.php +invio IN TUTTI I BROWSERs
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php
$continua = false;
if (isset($_SERVER['HTTP_REFERER']) != "") {
$from = parse_url($_SERVER['HTTP_REFERER']);
$from = $from['host'];
}
else {
$from = "";
}
$whitelist = array(
/*Qui scrivi l'url del mio sito in modo che quando l'utente vi arriva DA TERZI, anche se digita url +pagine, il contatore non sale.
Se poi è nel mio sito e ci clicca su, ovviamente il contatore nel db sale*/
"www.gruppoalveo.it", //Scrivi gli url senza http://
"gruppoalveo.it",
"www.gruppoalveo.altervista.org",
"gruppoalveo.altervista.org"
);
foreach ($whitelist as $sito) {
if ($from == $sito) $continua = true;
}
if ( isBot() ) {
}
else {
if ($continua) {
$data_localeS=time();
$mysqli = new mysqli("localhost", "gruppoalveo", "root", "my_gruppoalveo");
$giorno=array('Dom','Lun','Mar','Mer','Gio','Ven','Sab');
$mese=array('gen','feb','mar','apr','mag','giu','lug','ago','set','ott','nov','dic');
$dataGmtS=$giorno[date('w')].' '.date('d').' '.$mese[date('m')-1].' '.date('Y - H:i:s');
$ip = $_SERVER['REMOTE_ADDR'];
$url = $_SERVER['PHP_SELF'];
$esiste = $mysqli->query ("SELECT * FROM visitate WHERE url='$url'");
if ($esiste->num_rows == 0) {
$visite = 1;
$mysqli->query ("INSERT INTO visitate(data_localeS, dataGmtS, pagina, url, visite, ip)
VALUES ('$data_localeS', '$dataGmtS', '$pagina', '$url', '$visite', '$ip')");
}
else {
$old = $esiste->fetch_array(MYSQLI_ASSOC);
$visite = $old['visite'] + 1;
$mysqli->query("UPDATE visitate SET data_localeS='$data_localeS', dataGmtS='$dataGmtS', pagina='$pagina', visite='$visite', ip='$ip' WHERE url='$url'");
}
}
}
}
}
//Estrae i dati dal DB e crea la sequenza delle pagine più viste
$mysqli = new mysqli("localhost", "gruppoalveo", "root", "my_gruppoalveo");
$pag_viste = $mysqli->query("SELECT * FROM visitate ORDER BY visite DESC LIMIT 0,8"); //Visualizza il numero di items
if ($pag_viste->num_rows > 0) {
echo "<div class=\"menuVisti\">";
while ($link = $pag_viste->fetch_array(MYSQLI_ASSOC)) {
echo "<div class=\"numeroVisite\">".$link["visite"]." volte</div>";
echo "<a class=\"visti\" href='".$link['url']."'>• ".$link['pagina']."</a>";
}
echo "</div>";
}
error_reporting (E_ALL);
?>
Ultima modifica di gruppoalveo : 22-10-2014 alle ore 02.02.24
non c'è conflitto tra isBot e il resto piuttosto $continua = undef se c'è il cookie
dimostrazione
Codice PHP:
function contatore($pagina) {
// se non c'è il cookie
$continua = false
$from = %qualcosa%
}
else { // se c'è il cookie
$from = "";
}
...
foreach ($whitelist as $sito) {
if ($from == $sito) $continua = true; // se from = "", nessun sito in whitelist corrisponde
}
da questo punto e fino alla fine: $continua = undef
doppie visite: ci sono vari modi, i piu' semplici
rendi la data visita espressa in giorno/mese/anno-ora/minuti + ip visitatore chiave, aka non saranno accettate 2+ visite dello stesso ip in 1 minuto
oppure se memorizzi l'intero timestamp prima di insert spendi una query per chiederti se esiste una visita di questo ip risalente a meno di %tolleranza% secondi/millisecondi fa
Ultima modifica di FormularioDiDrakensang : 22-10-2014 alle ore 11.31.51
Ho fatto una prova con un visitatore, il db registra la sua visita, la mia no, ovviamente.
Il db inserisce così: 1413965682 Mer 22 ott 2014 - 10:14:42 "Stare da Dio" /stare-da-dio.php Visite:36 Ip:93.45.210.129
come scritto sopra se non correggi contatore() affinchè scriva qualcosa in from nel caso in cui ci sia il cookie o comunque setti continua=true; la visita non verrà mai conteggiata fintanto che non scade il cookie, se è quello che vuoi il codice è corretto
db: ok usi epoch, puoi fare riferimento a quanto scritto prima per il filtro
Ultima modifica di FormularioDiDrakensang : 22-10-2014 alle ore 11.40.57
Non so cos'è epoch, uso mysql.
Che ci metto qui;
function contatore($pagina) {
if (empty($_COOKIE["contavisite"])) { //Richiama il cookie che c'è in cookie.php
$continua = false;
if (isset($_SERVER['HTTP_REFERER']) != "") {
$from = parse_url($_SERVER['HTTP_REFERER']);
$from = $from['host'];
}
else {
$from = "";
}
$whitelist = array(
...
se devi contare la visita anche se cookie è settato
else {
$from = "";
$continua = true;
}
---
epoch
1413965682 Mer 22 ott 2014
questo numero lungo è il numero di secondi dal 1/1/1970, ovvero quello che da time()
per sapere se c'è una visita di meno 5 secondi fa (redirect)
select un_campo_qualsiasi_inutile_prenderli_tutti FROM la_tabella WHERE timestamp_attuale - il_campo_con_il_timestamp < 5
se restituisce almeno una riga, ignori la visita, cioè non fai insert
Ultima modifica di FormularioDiDrakensang : 22-10-2014 alle ore 11.57.30
Io devo contare solo le visite dei visitatori (ma non se entrano direttamente dalla home, solo quelle che linka nel sito), il cookie è solo per me
allora il codice è gia' giusto cosi
Si, ma c'è da sistemare il doppio inserimento nel db…io non cosa toccare.
l'ho scritto al messaggio #43
hai due scelte, il metodo della chiave
il metodo della ricerca
per il primo non devi fare niente nel codice php, ma solo nel db (oh be dipende dalla struttura del db)
nel secondo
$q = mysql_query ( quello che ho scritto sopra )
if ( mysql_num_rows($q) ) $continua = false;
il tutto prima di
if ($continua) {
$data_localeS=time();
Ultima modifica di FormularioDiDrakensang : 22-10-2014 alle ore 13.09.34
Sto tentando d capire il secondo metodo.
devi solo sostituire ai nomi di fantasia i nomi dei campi della tua tabella
esempio pratico:
$t = time();
$q = mysql_query ( "SELECT * FROM visite WHERE $t - timestamp_visita < 5 AND ip = $ip" );
if ( mysql_num_rows($q) ) $continua = false;
Ultima modifica di FormularioDiDrakensang : 22-10-2014 alle ore 21.27.44
Inserisce ancora doppio
Codice PHP:
$data_localeS = time();
$q = mysql_query ( "SELECT * FROM visitate WHERE $data_localeS - timestamp_visita < 5 AND ip = $ip" );
if ( mysql_num_rows($q) ) $continua = false;
if ($continua) {
$data_localeS=time();
$mysqli = new mysqli("localhost", "gruppoalveo", "root", "my_gruppoalveo");
$giorno=array('Dom','Lun','Mar','Mer','Gio','Ven','Sab');
$mese=array('gen','feb','mar','apr','mag','giu','lug','ago','set','ott','nov','dic');
$dataGmtS=$giorno[date('w')].' '.date('d').' '.$mese[date('m')-1].' '.date('Y - H:i:s');
$ip = $_SERVER['REMOTE_ADDR'];
$url = $_SERVER['PHP_SELF'];
$esiste = $mysqli->query ("SELECT * FROM visitate WHERE url='$url'");
if ($esiste->num_rows == 0) {
$visite = 1;
$mysqli->query ("INSERT INTO visitate(data_localeS, dataGmtS, pagina, url, visite, ip)
VALUES ('$data_localeS', '$dataGmtS', '$pagina', '$url', '$visite', '$ip')");
}
else {
$old = $esiste->fetch_array(MYSQLI_ASSOC);
$visite = $old['visite'] + 1;
$mysqli->query("UPDATE visitate SET data_localeS='$data_localeS', dataGmtS='$dataGmtS', pagina='$pagina', visite='$visite', ip='$ip' WHERE url='$url'");
}
...
Con timestampvisita intendo il campo della tabella in cui la data è un numero lungo
Ok, funziona finalmente, mancavano gli apici e la variabile. Quel < 5 sono i secondi di ritardo?
Codice PHP:
$data_localeS = time();
$ip = $_SERVER['REMOTE_ADDR'];
$q = mysql_query ("SELECT * FROM visitate WHERE $data_localeS - data_localeS < 5 AND ip = '$ip'" );
if ( mysql_num_rows($q) ) $continua = false;
if ($continua) {
$data_localeS=time();
...
Ultima modifica di gruppoalveo : 22-10-2014 alle ore 23.48.36