exercice POO, classe Visite
Bonsoir,
Après avoir lus plusieurs cours sur la POO (Site du zero, developpez.com et votre site), je me suis lancé et ai tenté la création d'une classe Visite permettant de compter et d'affichier le nombre de visite de mon site.
J'ai malheureusement quelques problèmes et je viens demander votre aide afin d'avoir des réponses.
Voici mes codes :
Visite.class.phpclass Visite {// Attributsprivate $timestamp_24h;private $timestamp_30d;private $connection;private $table_Stats;private $timestamp;private $nb_visites_today;private $nb_visites_mois;private $nb_visites_cumul;// Méthodespublic function __construct($objSql, $nomTable) {$this->connection = $objSql;$this->table_Stats = $nomTable;$this->_controlerIP();}private function _controlerIP() {// on vérifie si l'IP se trouve déjà dans la table$ip = $this->connection->single_result('SELECT COUNT(*) AS visites FROM '.$this->table_Stats.' WHERE stats_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');if ($ip == 0) // L'ip ne se trouve pas dans la table, on va l'ajouter{$this->connection->query('INSERT INTO '.$this->table_Stats.'(stats_ip, stats_timestamp, stats_visites) VALUES(\'' . $_SERVER['REMOTE_ADDR'] . '\', ' . time() . ', 1)');}else // L'ip se trouve déjà dans la table{$this->timestamp = $this->connection->query('SELECT stats_timestamp FROM '.$this->table_Stats.' WHERE stats_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');if($this->timestamp_24h < $this->timestamp) // si le visiteur est venu il y a plus de 24h{$this->connection->query('UPDATE '.$this->table_Stats.' SET stats_timestamp=' . time() . ' AND stats_visites = stats_visites +1 WHERE stats_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');}else{$this->connection->query('UPDATE '.$this->table_Stats.' SET stats_timestamp=' . time() . ' WHERE stats_ip=\'' . $_SERVER['REMOTE_ADDR'] . '\'');}}}private function _calculVisitesJour() {$this->nb_visites_today = $this->connection->single_result('SELECT COUNT(1) AS visites_today FROM '.$this->table_Stats.' WHERE stats_timestamp >'.$this->timestamp_24h);}private function _calculVisitesMois() {$this->nb_visites_mois = $this->connection->single_result('SELECT COUNT(1) AS visites_mois FROM '.$this->table_Stats.' WHERE stats_timestamp >'.$this->timestamp_30d);}private function _calculVisitesTotal() {$this->nb_visites_cumul = $this->connection->single_result('SELECT COUNT(1) AS visites_total FROM '.$this->table_Stats);}public function getVisitesJour() {return $this->nb_visites_today;}public function getVisitesMois() {return $this->nb_visites_mois;}public function getVisitesTotal() {return $this->nb_visites_cumul;}}?>
Et voici la page ou je souhaite faire mes testes :
test.php// Adresse du serveur de base de données// Login// Mot de passe// Nom de la base de données// Nom des tables utiles$visite = new Visite($connection, DB_STATS_TABLE);?>Aujourd'hui : echo $visite->getVisitesJour(); ?> Mois : echo $visite->getVisitesMois(); ?> Total : echo $visite->getVisitesTotal(); ?> $connection->close();?>
J'ai en faite deux questions :
- Peut-on utiliser un objet d'une classe dans une autre classe comme je le fais avec mon objet de ma classe MySQL ?
- Si oui, j'aimerai savoir comment il faut faire, car ma classe Visite ne le retourne rien.
Merci d'avance, Mimos@
Réponses apportées à cette discussion
Salut Mimos@,
tu n'as aucun message d'erreur ? Vérifie ta configuration : dans ton php.ini, il faudrait :
- display_error = on
et :
- error_reporting = E_ALL | E_STRICT
Tu peux aussi vérifier les logs Apache et MySQL, tu y trouveras peut-être des informations utiles.
J'ajoute que tu as une erreur SQL dans la première requête UPDATE de ta méthode _controlerIP() : pas de "AND" dans la partie SET, on sépare les colones à mettre à jour avec une virgule. Donc :
Exemple valide
UPDATE nomTable SET colonne1 = 'valeur1', colonne2 = 'valeur2' WHERE colonnex = 'valeurx';
Au lieu de
Exemple invalide
UPDATE nomTable SET colonne1 = 'valeur1' AND colonne2 = 'valeur2' WHERE colonnex = 'valeurx';
Merci de ta réponse aussi rapide.
Je ne savais pas que le AND était invalide avec le SET.
J'ai en faite résolue mon problème... Il s'agissait d'une erreur vraiment bête de ma part. En effet, dans mon code j'appelle bien les méthodes getVisitesJour(), ect, mais à aucun moment dans la classe, je n'appelle les méthodes _calculVisitesJour() ,ect.
Donc au final les diffèrents attributs que j'appelle par mes méthodes get n'étaient pas renseignés.
