Qualcuno mi dice dove sbaglio in questa classe ..

otto9due

Utente Attivo
22 Feb 2014
591
25
28
Ho tentato di creare una classe ( contaclick ) che mi aggiungesse +1 alla voce click del mio db per ogni click su un prodotto.
Faccio arrivare l'id del prodotto selezionato tramite get es: www.miosito.it/paginaricevente.php?id=1

la ricevo così..

PHP:
<?php 
include 'classi.php';
$id = $_GET['id'];
$addclickclass = new Contaclick();
$addclickclass->addclick($id);
?>

La classe è la seguente.. cerco di commentarla così da spiegare come ho operato..

PHP:
/*Inizio classe contaclick*/
Class Contaclick {
	
	function addclick($id) {
		
		$this->id = $id; // setto l'id
		$this->ip = $_SERVER['REMOTE_ADDR']; // setto l' ip che mi servirà dopo per un controllo sui click 
		include 'db/connection.php'; // Posso includere così?? Primo dubbio ..
		 try
		{ 
		  $sql = "SELECT COUNT(*) FROM prodotti WHERE id = '".$this->id."' AND ip != '".$this->ip."'"; /* seleziono e conto tutti i record dove l'id è uguale a quello passato e l'ip non è uguale a quello attualmente in uso.. così evito che qualcuno che ha già cliccato venga ricontato..*/
		  $result = $pdo->query($sql);
		  $final = $result->fetch();
		  
		}
		catch (PDOException $e)
		{
		  $error = 'Error: ' . $e->getMessage();
		  include 'error.html.php';
		  exit();
		} 
		      
 	if ($final[0] > 0){ // se esiste quindi è maggiore di 0 ..
		include 'db/connection.php';
		  try
			{
			  $sql = 'SELECT linkprod FROM prodotti WHERE id = "'.$this->id.'"'; // mi prelevo il suo link
			  $result = $pdo->query($sql);
			}
			catch (PDOException $e)
			{
			  $error = 'Error: ' . $e->getMessage();
			  include 'ERRORDB/outputpage.php';
			  exit();
			}     
			foreach ($result as $row)
			{
			  $prodchange[] = array(
				'id' => $row['id'],
				'linkprod' => $row['linkprod']	
			  );
			}
	}
			if ($prodchange[id] > 0){  // Se ancora l'id è maggiore di 0..
				$this->link = $prodotto['linkprod'];   // setto il link
				include 'db/connection.php';
				try
				  {
						$sql = 'UPDATE prodotti SET  // provo ad aggiornare i click aggiungendone uno e aggiorno anche l'ip ( che di defoult è 0 )
								click = click + 1,
								ip = "'.$this->ip.'"
								WHERE id = "'.$this->id.'"';
						$pdo->query($sql);
				  }
				  catch (PDOException $e)
				  {
						$error = 'Errore aggiornamento click prodotti.';
						include 'db/ERRORDB/outputpage.php';
						exit();
				  }
		
				  header("location: ". $this->link);
				  exit();
		
						  } else { // se l'id non è maggiore di 0 quindi è un utente che ha fatto un secondo click reindirizza senza calcolare il click.. 
				  header("location: ". $this->link);
						  }
	
	}
}
/* fine classe contaclick*/

Ma avviato il tutto mi appare la pagina bianca.. ma non procede al reindirizzamento ne all'update dei valori nel db.. Secondo voi perchè??
Grazie per le eventuali risposte :)
 
Corretta e funzionante.. In pratica, fa questo:
Quando qualcuno clicca sul link verifica che l'ip, non sia uguale all'ultimo ip registrato nel db ( per impedire che qualcuno si diverta a far aumentare i click appositamente ).
Se l'ip è diverso, aggiunge un click, altrimenti ci reindirizza nuovamente al link senza aggiungere alcun click.

P.S. per realizzarla ho preso spunto da un articolo trovato in questo forum, implementando la possibilità di filtrare per ip ( ringrazio l'autore che ora non ricordo :P ) ..

Qualora dovesse servire a qualcuno ecco la classe
Ovviamente a voi la scelta di utilizzare il foreach o semplicemente il fetch() nel secondo blocco try-catch ( così facendo la accorcereste un pò forse :P ):

PHP:
/*Inizio classe contaclick*/
Class Contaclick {
	
	function addclick($id) {
		
		$this->id = $id;
		$this->ip = $_SERVER['REMOTE_ADDR'];
		include 'db/connection.php';
		 try
		{ 
		  $sql = "SELECT COUNT(*) FROM prodotti WHERE id = '".$this->id."' AND ip != '".$this->ip."'";
		  $result = $pdo->query($sql);
		  $final = $result->fetch();
		  
		}
		catch (PDOException $e)
		{
		  $error = 'Error: ' . $e->getMessage();
		  include 'error.html.php';
		  exit();
		} 
		      
		include 'db/connection.php';
		  try
			{
			  $sql = 'SELECT click, linkprod, ip FROM prodotti WHERE id = "'.$this->id.'"';
			  $result = $pdo->query($sql);
			}
			catch (PDOException $e)
			{
			  $error = 'Error: ' . $e->getMessage();
			  include 'ERRORDB/outputpage.php';
			  exit();
			} 
			    
			foreach ($result as $row)
			{
			  $datiprodotti[] = array(
				'id' => $row['id'],
				'click' => $row['click'],				
				'linkprod' => $row['linkprod'],	
				'ip' => $row['ip']
			  );
			}
			foreach ($datiprodotti as $datoprodotto) {
			   	$this->idselect = $datoprodotto["id"];
				$this->click = $datoprodotto["click"];
				$this->link = $datoprodotto["linkprod"];
				$this->ipconfronta = $datoprodotto["ip"];
			}


			if ($this->ipconfronta != $this->ip AND $final[0] > 0){
				include 'db/connection.php';
				try
				  {
						$sql = 'UPDATE prodotti SET 
								click = click + 1,
								ip = "'.$this->ip.'"
								WHERE id = "'.$this->id.'"';
						$pdo->query($sql);
				  }
				  catch (PDOException $e)
				  {
						$error = 'Errore aggiornamento click prodotti.';
						include 'db/ERRORDB/outputpage.php';
						exit();
				  }
		
				  header("location: ". $this->link);
				  exit();
		
						  } else {
				  header("location: ". $this->link);
				  exit();
						  }
	
				}
}
/* fine classe contaclick*/
Ovviamente a migliorarla ci siamo sempre.. Sono un principiante .. non me ne vogliate :p
 
Per migliorarla potresti controllare che l'IP che ha cliccato non abbia già cliccato un'altra volta nella giornata.
 
Io sul db salvo solo l'ultimo ip, sostituendolo con quello che clicca dopo il precedente.. quindi poi come confronto?? Dovrei salvare tutti gli ip??
 
si dovresti salvare tutti gli ip della giornata :)
Se vuoi avere un bel sistema di controllo avresti già dovuto prevedere una cosa del genere.
Se non l'hai fatto è il momento buono per farlo.
 

Discussioni simili