Contatore visite per ogni pagina con MYSQL - PHP

Alessandro Le Mura

Utente Attivo
28 Apr 2013
74
0
0
www.glaucusgames.com
PHP:
 <?php
// identificativo numerico della pagina
$pagina = 1;

// connessione db mysql
mysql_connect("");
mysql_select_db("") or die("Impossibile selezionare il database.");

// numero di visite attuali
$res = mysql_query("UPDATE contatore SET visite = visite + 1 WHERE pagina = $pagina"); 

// visualizzazione numero visite
$res = mysql_query("SELECT visite FROM contatore WHERE pagina = $pagina");
$visite = mysql_fetch_assoc($res);
echo "La pagina è stata visitata ".$visite['visite']." volte"; 

mysql_close()
?>

Questo contatore e sembra funzionare perfettamente, solo che vorrei un contatore per visite uniche, per IP, cosa devo aggiungere o modificare? Oppure anke a tempo col timestamp andrebbe bene, tipo ogni 24 ore
 
Ultima modifica di un moderatore:
ciao
ti conviene per IP, devi però modificare la tabella
vedi
https://www.mrw.it/mysql/meno-query-grazie-insert-on-duplicate-key-update_7436.html
e fare come da schema che segue
PHP:
<?php
$ip=$_SERVER['HTTP_REFERER'];
$pagina = 1;
//dati di connessione
$res=mysql_query("INSERT INTO contatore VALUES('$ip', 1, '$pagina ') ON DUPLICATE KEY UPDATE visite = visite + 1");//non ho messo il tempo
$res = mysql_query("SELECT SUM(visite) FROM contatore WHERE pagina = $pagina");
//eccetera...
?>

poi se vuoi un consiglio:usa google analitycs ti da molte altre indicazioni
 
si già lo uso google analytics, è ke mi serve contare le visite praticamente di ogni pagina x i giocatori, e pubblicare il numero delle visite di ogni gioco in una classifica in homepage, è già tutto realizzato però come contatore php - txt, ed è alquanto instabile, cmq ok ora provo grazie
 
chiedo scusa per i post consecutivi, non ho trovato un tasto per modificare il messaggio, in pratica se dovrei contare le visite in ogni pagina dovrei creare una tabella per ogni pagina? per esempio gioco 1 databasecontatore tabella 1, gioco 2 databasecontatore tabella 2, gioco 3 databasecontatore tabella 3. E' fattibile come cosa o è una follia poichè viene architettata male e rallenterebbe?
 
ciao
il codice google sta nell'head di ogni pagina che vuoi monitorare
se vuoi avere pag per pag ribadisco usa google analitycs, creandoti il tuo account, a titolo di esempio vedrai visite, visitatori unici, visite per pag, unici per pag, tempo di permanenza sul sito e sulla pagina, da dove vengono i visitatori e molte altre cose
 
si ma poi mi serve creare una classifica php che mette al primo posto la pagina con 100 visualizzazione, al secondo la pagina con 68 visualizzazioni al terzo la pagina con 41 visualizzazioni..
E poi mi serve in ogni pagina il numero di visite uniche stampato a video x gli utenti..
Capito?
 
Ti stavo suggerendo anche io analytics (ovviamente) ma vedendo il tuo bisogno credo sia meglio fare (a mano) un contatore pagina per pagina ma che distingua gli ip almeno altrimenti ogni volta che uno aggiorna la pagina si aggiorna il contatore.
 
ciao
intanto dai un occhio a questo schema per monitorare le visite
PHP:
<?php
$ip=$_SERVER['HTTP_REFERER'];
$pagina_num = 1;
$pagina=$_SERVER['PHP_SELF'];//potrebbe farti comodo per sapere il nome della pagina es gioco_primo.php
$ora=time();//leggo il mometo della visita quindi
//dati di connessione
$query_1=mysql_query("SELECT * FROM contatore WHERE pagina_num=$pagina_num AND ip='$ip'");
if(mysql_num_rows($query_1)== 0){//non ci sono record per qull'ip e quella pagina
	$query_2=mysql_query("INSERT INTO contatore(pagina, pagina_num,ip, visite, tempo) SET('$pagina',$pagina_num,'$ip', 1, $ora)");
}else{//il record esiste
	$riga=mysql_fetch_array($query_1);
	//verifico l'intervallo di tempo tra l'ultima visita e l'attuale
	//e lo trasformo in ore
	$intervallo=($ora-$riga['tempo'])/3600;
	//verifico che siano passate almeno 24 ore dall'ultima visita (ma a te decidere il tempo)
	if($intervallo > 24){
		//sono passate più di 24 ore quindi uppo le visite e il tempo, altrimenti non faccio nulla
		$query_3=mysql_query("UPDATE contatore SET visite=visite +1, tempo=$ora WHERE pagina_num=$pagina_num AND ip='$ip'");
	}
}
?>
tabella contatore
id int(9) autoincrement primarykey
pagina varchar(25)
pagina_num int(3)
ip varchar(25)
visite int(9) default 0
tempo int(15)

poi, se ti va bene, a dopo la visualizzazione

p.s.
guarda che è da provare e verificare che non abbia fatto qualche errore, non l'ho testato
 
ciao
ecco come potresti vedere i risultati
PHP:
<?php
//dati di connessione
$query=mysql_query("SELECT pagina, SUM(visite) AS tot FROM contatore GROUP BY pagina");//o pagina_num se non usi il nome di pagina
echo "<table class=\"pinco\">";
echo "<tr><th>pagina</th><th>visite</th></tr>";
while($riga=mysql_fetch_array($query)){
	$pagina=$riga['pagina'];
	$visite=$riga['tot'];
	echo "<tr><td>$pagina</td><td>$visite</td></tr>";
}
echo "<table>";
?>
volendo puoi fare lo stesso discorso per l'ip

p.s.
anche questo non l'ho testato
 
ciao
scusa volevo scrivere 11 è l'intero del timestamp, comynque non da visualizzare ma quante cifre intere può contenete al massimo il campo
 
ok, grazie.. Il problema attualmente è ke mi scrive pagine e visite in tabella, ma nn compare nulla, ho controllato il database e non ci sono i dati memorizzati, o sono anticappato xD e ho sbagliato la connessione mysql al database e nn memorizza i dati, o c'è qlk problema nel codice nella parte di update dati nella tabella, io nel frattempo continuo a controllare e provare e vediamo.

PHP:
<?php
// connessione al database MySQL
mysql_connect("asd", "asd", "asd");
mysql_select_db("my_asd") or die("Impossibile selezionare il database.");

$ip = $_SERVER['HTTP_REFERER'];
$pagina_num = 1;
$pagina = $_SERVER['PHP_SELF']; //potrebbe farti comodo per sapere il nome della pagina es gioco_primo.php
$ora = time(); //leggo il momento della visita quindi

//dati di connessione
$query_1 = mysql_query("SELECT * FROM contatore WHERE pagina_num = $pagina_num AND ip = '$ip'");
if(mysql_num_rows($query_1)== 0){ //non ci sono record per quell'ip e quella pagina
    
    $query_2 = mysql_query("INSERT INTO contatore(pagina, pagina_num, ip, visite, tempo)
    SET('$pagina', '$pagina_num', '$ip', 1, '$ora')");
    
}else{ //il record esiste

    $riga = mysql_fetch_array($query_1);
    //verifico l'intervallo di tempo tra l'ultima visita e l'attuale
    //e lo trasformo in ore
    $intervallo = ($ora - $riga['tempo'])/3600;
    //verifico che siano passate almeno 24 ore dall'ultima visita (ma a te decidere il tempo)
    if($intervallo > 24){ //sono passate più di 24 ore quindi uppo le visite e il tempo, altrimenti non faccio nulla
        $query_3 = mysql_query("UPDATE contatore SET visite = visite +1, tempo = $ora WHERE pagina_num = $pagina_num AND ip = '$ip'");
    }
}

//dati di connessione
$query = mysql_query("SELECT pagina, SUM(visite) AS tot FROM contatore GROUP BY pagina");//o pagina_num se non usi il nome di pagina
echo "<table>";
echo "<tr><td>pagina</td><td>visite</td></tr>";
while($riga=mysql_fetch_array($query)){
    $pagina=$riga['pagina'];
    $visite=$riga['tot'];
    echo "<tr><td>$pagina</td><td>$visite</td></tr>";
}
echo "</table>";

mysql_close()
?>
 
Ps.: nel pezzo di while ho sostituito $visite=$riga['tot']; con $visite=$riga['visite']; tot non esiste

PHP:
//dati di connessione
$query = mysql_query("SELECT pagina, SUM(visite) AS tot FROM contatore GROUP BY pagina");//o pagina_num se non usi il nome di pagina
echo "<table>";
echo "<tr><td>pagina</td><td>visite</td></tr>";
while($riga=mysql_fetch_array($query)){
    $pagina=$riga['pagina'];
    $visite=$riga['visite'];
    echo "<tr><td>$pagina</td><td>$visite</td></tr>";
}
echo "</table>";

mysql_close()
?>
 
ciao
tuo penultimo post:
non fa l'insert?
perche quarda che, se stai provando in locale o anche da remoto sempre dallo stesso ip, l'update non lo fa in quanto per il tuo ip e per quella pagina non sono trascorse 24 ore
se vuoi vedere se uppa prova a commentare l'if del tempo
PHP:
<?php
    //if($intervallo > 24){ //sono passate più di 24 ore quindi uppo le visite e il tempo, altrimenti non faccio nulla
        $query_3 = mysql_query("UPDATE contatore SET visite = visite +1, tempo = $ora WHERE pagina_num = $pagina_num AND ip = '$ip'");
    //} 
?>
in questo modo dovrebbe uppare anche al refresh della pagina

per l'ultimo
si come nome non esiste un campo chiamato tot, ma è un alias
SUM(visite) AS tot cioè la sum di visite si chiama tot
 
Allora, ho provato quello ke hai detto e non andava, ho riguardato il codice è ho provato a sostituire SET con VALUES:

PHP:
//dati di connessione
$query_1 = mysql_query("SELECT * FROM contatore WHERE pagina_num = $pagina_num AND ip = '$ip'");
if(mysql_num_rows($query_1)== 0){ //non ci sono record per quell'ip e quella pagina
    
    $query_2 = mysql_query("INSERT INTO contatore(pagina, pagina_num, ip, visite, tempo)
    ---> SET con VALUES<---('$pagina', '$pagina_num', '$ip', 1, '$ora')");

Risultato ho fatto 3 aggiornamenti della pagina, l'output video è questo:
pagina visite
/mysql/mysql1.php 3

Mentre su MySQL nella tabella si sono formati 3 record:
Modifica Elimina 1 /mysql/mysql1.php 1 http://s190.altervista.or 1 1368196667
Modifica Elimina 2 /mysql/mysql1.php 1 http://s190.altervista.or 1 1368196670
Modifica Elimina 3 /mysql/mysql1.php 1 http://s190.altervista.or 1 1368196671

E' giusta la modifica ke ho fatto?
 
Ultima modifica:

Discussioni simili