Exercice POO, classe Visite - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

exercice POO, classe Visite

Par Mimosa -  2 reponses -  Le 01/11/2008 -  Flux RSS - 

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.php
class Visite {
// Attributs
private $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éthodes
public function __construct($objSql, $nomTable) {
$this->connection = $objSql;
$this->table_Stats = $nomTable;
$this->timestamp_24h = time() - 86400;
$this->timestamp_30d = time() - 2592000;
$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
require(dirname(__FILE__).'/classes/class.mysql.php');
require(dirname(__FILE__).'/classes/Visite.class.php');
 
// Adresse du serveur de base de données
define('DB_SERVEUR', 'localhost');
 
// Login
define('DB_LOGIN','root');
 
// Mot de passe
define('DB_PASSWORD','');
 
// Nom de la base de données
define('DB_NOM','testPOO');
 
// Nom des tables utiles
define('DB_STATS_TABLE','stats');
 
$connection = new mysql(DB_SERVEUR, DB_LOGIN, DB_PASSWORD, DB_NOM);
$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

    Par Cyrano -  Le 01/11/2008 - 

    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
    1. UPDATE nomTable
    2. SET colonne1 = 'valeur1',
    3. colonne2 = 'valeur2'
    4. WHERE colonnex = 'valeurx';

    Au lieu de

    Exemple invalide
    1. UPDATE nomTable
    2. SET colonne1 = 'valeur1'
    3. AND colonne2 = 'valeur2'
    4. WHERE colonnex = 'valeurx';

     

     

     

     

     
    Par Mimosa -  Le 01/11/2008 - 

    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.

     

    Ajouter une réponse à la discussion

    Seuls les membres loggués sont autorisés à poster dans les forums !