Incremento contatore click

davide1982

Nuovo Utente
14 Giu 2010
26
0
0
Salve a tutti,

nel mio nuovo sito ho alcuni link affiancati dal numero di click effettuati su quel link. Al momento uno stesso utente potrebbe cliccare 100 volte su quel link e il contatore aumenterebbe di 100.

D'altra parte essendo un contatore di visite credo non sia nemmeno sbagliato che se uno stesso utente ritorna e clicca una seconda volta su quel link il contatore aumenti di nuovo...

Cosa mi consigliate? Meglio lasciarlo così com'è o meglio fare in modo che il contatore aumenti solo di una volta per utente? E se sì, devo farlo coi cookie giusto?

Grazie dell'attenzione...
:)
 
ciao
secondo me dovresti fare come in molti siti di votazione
tra un click e l'altro dovrebbe passare un certo tempo
così mi sembra più serio, soprattutto se uno guadagna qualcosa dal click
 
potresti anche memorizzare in db gli ip di tutti quelli che cliccano e se hanno già cliccato il contatore non aumenta.
come dice borgo italia dipende dall'uso che ne devi fare
 
no i click non comportano guadagno... l'utilizzo è più come dato statistico, l'unica cosa che fanno è ordinare i link da quello con più click a quello con meno.
In effetti concordo con voi riguardo a lasciar passare un po' di tempo tra un click e l'altro.

Quindi adesso ci provo!
Però non ho ben chiaro come procedere: utilizzo i cookie, l'IP o entrambi? :confused:
 
Tutti e due i sistemi hanno dei pro e dei contro.

Prendiamo il sistema con i cookie. In questo caso l'utente non può sabotare la sua identità in alcun modo, perché il cookie viene salvato sul browser. Però può cancellarlo ed è come se non fosse mai passato di lì.

Prendiamo il sistema, invece, con gli IP. Salvi l'IP dell'utente nel database. II pro sono che l'utente non può accedere al dato, perché il database risiede sul tuo sito. Ma al giorno d'oggi il 90% degli IP sono dinamici, a meno che non si tratti di server o altro. Quindi basterà ricollegarsi per avere un IP diverso.

Quindi facci sapere quale preferisci! :D
 
Ok, mi son "buttato" sui cookie, ma ho un problemino 0:) :

Avendo più link da monitorare, se nel codice scrivo solo: if (!isset($_COOKIE[$nome_cookie]) {}, qualsiasi altro link clicco dopo che ho già i cookie non viene più incrementato......

e quindi........... come faccio ad assegnare un cookie specifico per ogni link?

PHP:
#Recupero il valore che ho assegnato al cookie dal link
$link_cookie = $_GET['c'];

$nome_cookie = "cl_track";
$valore_cookie = $link_cookie;
$durata_cookie = time()+24*3600;
setcookie($nome_cookie,$valore_cookie,$durata_cookie);
$exist_cookie = $_COOKIE[$nome_cookie];

(...)

#Aggiorno il contatore
if (!isset($exist_cookie) or (isset($exist_cookie)!=$valore_cookie)) {
$sql2 = "UPDATE $tabella SET numclick = numclick + 1 WHERE id = '$linkid'"; $result2 = mysql_query($sql2);
}

Ovviamente sto sbagliando perché in questo modo ogni volta che clicco un link mi sostituisce il vecchio valore del cookie con quello nuovo... ma non mi viene in mente nessuna soluzione migliore... :hammer:
 
ciao
da quello che capisco tu hai una tabella con i seguenti campi
id (immagino primary autoincrement int)
numclick int

prova ad aggiungere un campo
cliccato_il int(15) default 0

ora ti metto un po' di php (a te poi eventualmete aggiustarlo rendendolo più snello)
prendilo solo come un ragionamento di base

PHP:
<?php
//...............
$sql_1 ="SELECT * FROM $tabella WHERE id='$linkid'";
//verifico che esista
$esite=mysql_num_rows(mysql_query($sql_1));
if($esite==0){//non esiste
	$result_1= mysql_query("INSERT INTO $tabella(numclich, cliccato_il) VALUE(1, ".time()."))";
	//metto il numero di click a 1 e il tempo del momento del click
}else{//il link esiste in quanto gia stato cliccato
	$tempo=time()-24*3600;//leggo il tempo attuale e tolgo 24 ore
	//metto una condizione in più cioè uppo solo se il tempo è trascorso
	//se trascorso incrementa i click e riregola il tempo
	$sql_2 = "UPDATE $tabella SET numclick = numclick + 1, cliccato_il=".time()." WHERE id = '$linkid' AND cliccato_il < '$tempo'";
	$result_2 =mysql_query($sql_2);
}
//...........
?>
in questo modo non devi usare i cookie e quindi più difficle imbrogliare (che tra l'altro mi sono antipatici)
un determinato id viene aggiornato solo se è passato un giorno

p.s.
verifica mi devo essere confuso con <
spero non sia una cavolata
 
Ho sviluppato una soluzione che sfrutta i cookie ed è anche difficile da sabotare, a meno di non cancellare l'intero cookie. Il nome del cookie viene camuffato in modo che non sia facilmente rintracciabile. Il suo contenuto viene serializzato (è un array, così supporta anche più di un link con la stessa pagina) e successivamente codificato in base 64. Ecco il codice:
PHP:
<?php
// imposta il nome del cookie
$cookie_name = sha1('clicked');
$cookie_name = substr($cookie_name, 0, 7);

// si connette al database
$conn = mysql_connect('localhost', 'root') or die(mysql_error());
mysql_select_db('mydb', $conn) or die(mysql_error());

// recupera il link richiesto
$url = isset($_GET['url']) ? trim(addslashes($_GET['url'])) : '';

// controlla che un link sia impostato
if($url != '')
{
	// recupera il link dal database
	$query = mysql_query("SELECT * FROM links WHERE url='{$url}'") or die(mysql_error());
	
	// controlla che il link esista
	if(mysql_num_rows($query) == 1)
	{
		// recupera i dati sul link
		$assoc = mysql_fetch_assoc($query);
		
		// decodifica il cookie
		$clicked = base64_decode($_COOKIE[$cookie_name]);
		$clicked = unserialize($clicked);
		
		// recupera la differenza dall'ultimo click
		$diff = time() - $clicked[$assoc['id']];
		
		// controlla che sia passata un'ora dal click
		if($diff > 3600)
		{
			// incrementa il contatore
			$sql = "UPDATE links SET clicks = clicks + 1 WHERE id='{$assoc['id']}'";
			mysql_query($sql) or die(mysql_error());
			
			// aggiorna il cookie
			$clicked[$assoc['id']] = time();
			
			// codifica il cookie
			$clicked = serialize($clicked);
			$clicked = base64_encode($clicked);
			
			// reimposta il cookie
			$_COOKIE[$cookie_name] = $clicked;
		}
		
		// reindirizza al link
		header("Location: {$url}");
	}
	// se non esiste
	else
	{
		// visualizza un errore
		echo '<h1>Link inesistente</h1>';
		echo '<p>Il link richiesto non &egrave; presente nel database.</p>';
	}
}
// se non è impostato
else
{
	// visualizza un errore
	echo '<h1>Nessun link impostato</h1>';
	echo '<p>Non hai richiesto nessun link a cui venire reindirizzato.</p>';
}

// chiude la connessione
mysql_close($conn) or die(mysql_error());
?>

Questo è invece il dump SQL della tabella links:
Codice:
CREATE TABLE IF NOT EXISTS `links` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` text NOT NULL,
  `clicks` bigint(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Fammi sapere se funziona e se ti serve qualche modifica! ;)
 
ciao
un altro suggerimento può essere questo, passando come dici tu dall'IP.
devi crearti due tabelle, una per i "cliccatori" e una per il contatore di click
ti metto giù sempre delle idee, comunque da sviluppare.

tabella cliccatori
id int(12) autoincremet primay key
ip string(50)
id_link int(12)
tempo int(15)

tabella contatore
id_link int(12) primari key
numclick int(12) default 0

quindi quando un utente clicca su un tuo link ne prelevi l'IP e l'id del link

per leggere l'IP (curiosando in giro) ho trovato questo (se ti può servire
PHP:
<?php
function legge_IP(){
	if(isset($_SERVER["HTTP_X_FORWARDED_FOR"])){//legge l'IP
		if ($_SERVER["HTTP_X_FORWARDED_FOR"] == "") {
			return getenv("REMOTE_ADDR");
		} else {
			return getenv("HTTP_X_FORWARDED_FOR");
		}
	} else {
		return getenv("REMOTE_ADDR");
	}
}//fine function
?>
poi da quello che ho capito leggi l'id del link con $_GET['c'];
quindi a questo punto
PHP:
<?php
//leggi l'id del link e l'IP dell'utente
$ip_utente = legge_IP();
$id_link=$_GET['c'];
//e leggi il tempo
$tempo=time();
//leggi la tabella cliccatori
$sql_1="SELECT * FROM cliccatori WHERE ip='$ip_utente' AND id_link='$id_link'";
$res_1=mysql_query($sql_1);
//ferifico l'esistenza del record
$esiste=mysql_num_rows($res_1);
if($esiste==0){// non esiste
	//creo il record su cliccatori
	sql_2="INSERT INTO cliccatori (ip,id_link,tempo) VALUE('$ip_utente','$id_link','$tempo')";
	res_2=mysql_query($sql_2);
	//l'utente non aveva mai cliccato su quel link
	//quindi lo creo il record su contatore o lo uppo
	$sql_3="INSERT INTO contatore VALUES('$id_link', 1) ON DUPLICATE KEY
			UPDATE numclick = numclick + 1";
	$res_3=mysql_query($sql_3);
}else{//l'utente aveva già cliccato sul link
	//leggo quando aveva cliccato
	$row=mysql_fetch_array($res-1);
	//verifico se ha cliccato meno di un giorno fa
	$tempo_addietro=$tempo-24*3600;
	if($tempo_addietro < $row['tempo']){// ha cliccato più di 24 ore fa'
		//uppo il suo record mettendo il tempo attuale
		$sql_4="UPDATE cliccatori SET tempo='$tempo' WHERE ip='$ip_utente'";
		$res_4=mysql_query($sql_4);
		//e uppo il contatore
		$sql_5="UPDATE contatore SET numclick = numclick + 1 WHERE id_link='$id_link'";
		$res_5=mysql_query($sql_5);
	}else{
		//avviso che non sono trascorse 24 ore dall'ultima volta che ha cliccato quel link
		//e non uppo nulla
		echo "devi aspettare NON sono trascorse ancora 24 ore";
	}
}
?>
guarda che come detto in precedenza è un'idea comunque da verificare.

p.s.
spero che il mio mèntore alex ci dia un occhio così dice se ho scritto ca...te
 
Teoricamente dovrebbe funzionare, però come ho già detto basta ricollegarsi per cambiare l'IP e cliccare un'altra volta. Comunque pensavo ad una cosa: perché un utente dovrebbe falsificare volutamente le tue statistiche? Io non penso che ci sia da preoccuparsi. Basta semplicemente creare un sistema che memorizzi l'ultima volta che l'utente ha cliccato sul link. A questo punto però è meglio il mio script, perché è più probabile che l'utente cambi IP piuttosto che cancelli i cookie.
 
Dunque, innanzitutto vi ringrazio entrambi della disponibilità.

Premetto che per la mia conoscenza del linguaggio php ancora piuttosto elementare mi sono "perso" in molti dei passaggi che mi avete proposto... Al di là di questo, il problema principale però è che non riesco ad adattarlo al codice che ho sviluppato precedentemente... (che tra l'altro non sono sicuro sia il migliore, però funziona piuttosto bene), e a questo punto lo riporto e lo spiego qui sotto:

PHP:
$result = mysql_query("SELECT img,link,numclick,descrizione FROM mia_tabella ORDER BY numclick DESC");
					
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
	printf("<div class='grid_8'><div class='screen'>%s</div><div class='text'><h2>%s<span class='visite'> &nbsp;- %s visite</span></h2> %s</div></div>", $row[0], $row[1], $row[2], $row[3]);  
	}
					
mysql_free_result($result);

Questo mi è risultato comodo perché con 4 righe di codice visualizzo nella mia pagina tutto il contenuto che ho nella tabella MySQL organizzato come voglio (immagine, link, visite, ecc.).
Il link però ho dovuto inserirlo direttamente nella tabella, in questo modo:
<a href="counter.php?tab=mia_tabella&id=1&dest=http://www.sitodestinazione.it/" target="_blank">mio_link</a>
Quindi il link viene preso dal database che mi rimanda al counter che incrementa e reindirzza al sito finale. ( un po' contorto?? :confused: )

Concludendo non ho idea se si può, e se sì come, adattare il codice di alessandro1997 a questo....

p.s.: se decidete di gettare la spugna con sta cosa lo capirei :)
 
Ecco ho fatto 30 e faccio 31 riportando anche il codice del mio counter.php (quello sopra era della mia pagina.php), magari può essere d'aiuto:

PHP:
require ("db/db.php");

#Recupero la tabella, l'ID, e il link di destinazione del mio link
$tabella = $_GET['t'];
$linkid = $_GET['id'];
$linkdest = $_GET['dest'];

#Seleziono il record corrispondente all'ID del link
$sql = "SELECT link FROM $tabella WHERE id = '$linkid'"; $result = @mysql_query($sql,$link); $numrows = mysql_num_rows($result);

#Se trovo l'ID selezionato...

if ($numrows!=0) {

#Reindirizzo l'utente sul sito di destinazione
Header("Location: ". $linkdest);

#Aggiorno il contatore
$sql2 = "UPDATE $tabella SET numclick = numclick + 1 WHERE id = '$linkid'"; $result2 = mysql_query($sql2);

}
#Se invece l'ID non esiste...
else
{
#stampo un errore!
print "Errore..."; }
 

Discussioni simili