begin process at 2010 02 10 02:08:42
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Class et Objet ( POO )

 > [PHP5] CLASSE DE NEWS

[PHP5] CLASSE DE NEWS


 Information sur la source

Note :
8 / 10 - par 2 personnes
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Class et Objet ( POO ) Classé sous :php5, poo, news, class, commentaires Niveau :Débutant Date de création :22/04/2006 Vu :6 273

Auteur : FhX

Ecrire un message privé
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note

 Description

Bon après Hametsu21, je poste la mienne.
Classe de news... utilisation très simple.

Je fais une étendu de classe (parce que j'ai la flemme de refaire ma classe pour ne faire qu'un bloc :p) à partir d'une classe abstraite. Simple à comprendre ca aussi :p

Allez zoup, le code :

Source

  • <?php
  • abstract class Objet {
  • // Propriété de connection à la base de donnée
  • protected $db;
  • // Sortie des données de la classe
  • public $output;
  • //* Initialisation de la connection à la base de donnée *//
  • protected function __construct($dbInit = TRUE) {
  • if ( $dbInit ) {
  • $this->db = mysql::GetInstance();
  • } else {
  • $this->db = NULL;
  • }
  • }
  • //* Fait le vide de la mémoire *//
  • public function __destruct() {
  • unset($this->output);
  • }
  • }
  • // Ca c'est juste la classe abstraite, voici la classe News :p
  • ?>
  • <?php
  • class News extends Objet {
  • public function __construct() {
  • parent::__construct();
  • }
  • // Supprime une news
  • // Retourne un booléen : TRUE/FALSE
  • public function DeleteNews($id) {
  • $this->db->prepare('DELETE FROM news WHERE id = {1}', $id);
  • $this->db->query();
  • return ( $this->db->affected_rows() === 1 ) ? TRUE : FALSE;
  • }
  • public function CountNews() {
  • $this->db->query('SELECT COUNT(id) FROM news');
  • $this->db->query();
  • $data = $this->db->fetch_row();
  • return ( (int) $data[0] );
  • }
  • public function GetUniqueNews($id) {
  • unset($this->output);
  • $this->db->prepare('SELECT id, titre, content, resume, DATE_FORMAT(date,"%d/%m/%Y à %H:%i") as date FROM news WHERE id = {1}',
  • $id);
  • $this->db->query();
  • $this->output = $this->db->fetch_array();
  • }
  • // $start => début de la requète
  • // $limit => Nombre d'enregistrement max
  • // $comm => Active la récupération des commentaires ou non
  • public function GetNews($start = 0, $limit = 30, $comm = 'count') {
  • unset($this->output);
  • switch ( strtolower($comm) ) {
  • case 'count' :
  • $this->db->prepare('SELECT news.id, news.titre, news.resume, DATE_FORMAT(news.date,"%d-%m-%Y") as date , COUNT(commentaires.id) as count , DATE_FORMAT( MAX(commentaires.date), "%d/%m/%Y") as lastcomm FROM news LEFT JOIN commentaires ON news.id = commentaires.id_news GROUP BY news.id ORDER by news.id DESC LIMIT {1},{2}',
  • $start, $limit);
  • break;
  • case 'no' :
  • $this->db->prepare('SELECT id, titre, content, resume, DATE_FORMAT(date,"%d/%m/%Y à %H:%i") as date FROM news ORDER BY id DESC LIMIT {1}, {2}',
  • $start, $limit);
  • break;
  • }
  • $this->db->query();
  • while ( $data = $this->db->fetch_array() ) {
  • $this->output[] = $data;
  • }
  • }
  • // Récupére les commentaires d'une news
  • // Retourne le nombre de commentaires
  • public function GetComm($id, $start = 0, $limit = 10) {
  • unset($this->output);
  • $this->db->prepare('SELECT pseudo, content, ip FROM commentaires WHERE id_news = {1} ORDER BY id ASC LIMIT {2}, {3}',
  • $id, $start, $limit);
  • $this->db->query();
  • while ( $data = $this->db->fetch_array() ) {
  • $this->output[] = $data;
  • }
  • return $this->db->num_rows();
  • }
  • // Compte le nombre de commentaires d'une news
  • public function CountComm($id) {
  • $this->db->prepare('SELECT COUNT(*) FROM commentaires WHERE id_news = {1}', $id);
  • $this->db->query();
  • $data = $this->db->fetch_row();
  • return ( (int) $data[0] );
  • }
  • // Ajoute un commentaire sur une news.
  • public function AddComm($pseudo, $content, $id) {
  • unset($this->output);
  • $this->db->prepare("INSERT INTO commentaires (pseudo, content, id_news, ip, date) VALUES ('{1}', '{2}', {3}, '{4}', NOW() )",
  • $pseudo, $content, $id, $_SERVER['REMOTE_ADDR']);
  • $this->db->query();
  • if ( $this->db->affected_rows() === 1 ) {
  • $this->output = $this->db->insert_id();
  • return true;
  • } else {
  • return false;
  • }
  • }
  • // Ajoute une news
  • // Retourne TRUE/FALSE en fonction de l'insertion dans la BDD
  • public function AddNews($titre, $resume, $content) {
  • unset($this->output);
  • $this->db->prepare("INSERT INTO news (titre, resume, content, date) VALUES ('{1}', '{2}', '{3}', NOW() )",
  • $titre, $resume, $content);
  • $this->db->query();
  • if ( $this->db->affected_rows() === 1 ) {
  • $this->output = $this->db->insert_id();
  • return true;
  • } else {
  • return false;
  • }
  • }
  • // Update une news
  • public function UpdateNews($titre, $resume, $content, $id) {
  • $this->db->prepare("UPDATE news SET titre = '{1}', resume = '{2}', content = '{3}' WHERE id = {4}",
  • $titre, $resume, $content, $id);
  • if ( $this->db->affected_rows() === 1 ) {
  • $this->output = $this->db->insert_id();
  • return true;
  • } else {
  • return false;
  • }
  • }
  • // Récupère l'ID qui va être inscrit dans la BDD
  • public function LastIDNews() {
  • $this->db->query('SELECT MAX(id)+1 FROM news');
  • $data = $this->db->fetch_row();
  • return ( (int) $data[0] ) ;
  • }
  • // Fin d'objet
  • public function __destruct() {
  • unset($this->output);
  • }
  • }
  • ?>
  • <?php
  • CREATE TABLE `news` (
  • `id` int(11) NOT NULL auto_increment,
  • `titre` varchar(255) NOT NULL,
  • `resume` varchar(255) default NULL,
  • `content` text NOT NULL,
  • `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  • PRIMARY KEY (`id`)
  • ) ENGINE=MyISAM
  • // Le timestamp peut être changé par un INT(11) ou un champ DATETIME ou autre :)
  • CREATE TABLE `commentaires` (
  • `id` int(11) NOT NULL auto_increment,
  • `pseudo` varchar(255) NOT NULL,
  • `content` text NOT NULL,
  • `date` datetime NOT NULL,
  • `id_news` int(11) NOT NULL,
  • `ip` varchar(255) NOT NULL,
  • PRIMARY KEY (`id`)
  • ) ENGINE=MyISAM
  • ?>
  • <?php
  • // Utilisation :
  • $news = new News;
  • // Je récupère les 10 dernières news ainsi que le nombre de commentaire sur chaque news.
  • $news->GetNews(0,10,'count');
  • foreach ( $news->output as $data ) {
  • // $code à l'intérieur :)
  • // Ca reste de la mise en page
  • }
  • ?>
<?php
abstract class Objet {
 
// Propriété de connection à la base de donnée
 protected $db;
 
// Sortie des données de la classe
 public $output;

//* Initialisation de la connection à la base de donnée *//
 protected function __construct($dbInit = TRUE) {
 
  if ( $dbInit ) {
      $this->db = mysql::GetInstance();
  } else {
      $this->db = NULL;
  }
  
 }
 
//* Fait le vide de la mémoire *//
 public function __destruct() {
  unset($this->output);
 }
 
}
// Ca c'est juste la classe abstraite, voici la classe News :p
?>
<?php
class News extends Objet {

 public function __construct() {
  parent::__construct();
 }
 
// Supprime une news
// Retourne un booléen : TRUE/FALSE 
 public function DeleteNews($id) {

  $this->db->prepare('DELETE FROM news WHERE id = {1}', $id);
  $this->db->query();
  
  return ( $this->db->affected_rows() === 1 ) ? TRUE : FALSE;

 }
 
 public function CountNews() {
 
  $this->db->query('SELECT COUNT(id) FROM news');
  $this->db->query();

  $data = $this->db->fetch_row();
  return ( (int) $data[0] );
  
 }
 
 public function GetUniqueNews($id) {
 
  unset($this->output);
  
  $this->db->prepare('SELECT id, titre, content, resume, DATE_FORMAT(date,"%d/%m/%Y à %H:%i") as date FROM news WHERE id = {1}',
                     $id);
  $this->db->query();
  
  $this->output = $this->db->fetch_array();
  
 }
 // $start => début de la requète 
 // $limit => Nombre d'enregistrement max
 // $comm => Active la récupération des commentaires ou non
 public function GetNews($start = 0, $limit = 30, $comm = 'count') {
 
  unset($this->output);
  
  switch ( strtolower($comm) ) {
  	       case 'count' :
                 $this->db->prepare('SELECT news.id, news.titre, news.resume, DATE_FORMAT(news.date,"%d-%m-%Y") as date , COUNT(commentaires.id) as count , DATE_FORMAT( MAX(commentaires.date), "%d/%m/%Y") as lastcomm FROM news LEFT JOIN commentaires ON news.id = commentaires.id_news GROUP BY news.id ORDER by news.id DESC LIMIT {1},{2}',
	                               $start, $limit);
			     break;
		   case 'no' :
                 $this->db->prepare('SELECT id, titre, content, resume, DATE_FORMAT(date,"%d/%m/%Y à %H:%i") as date FROM news ORDER BY id DESC LIMIT {1}, {2}',
	                               $start, $limit);
				 break;
		
  }
  $this->db->query();
  
   while ( $data = $this->db->fetch_array() ) {
		   $this->output[] = $data;
   }
   
 }
 
// Récupére les commentaires d'une news
// Retourne le nombre de commentaires
 public function GetComm($id, $start = 0, $limit = 10) {
  
  unset($this->output);
  
  $this->db->prepare('SELECT pseudo, content, ip FROM commentaires WHERE id_news = {1} ORDER BY id ASC LIMIT {2}, {3}',
                   $id, $start, $limit);
  $this->db->query();
  
   while ( $data = $this->db->fetch_array() ) {
           $this->output[] = $data;
   }
  
  return $this->db->num_rows();
   
 }
 
// Compte le nombre de commentaires d'une news 
 public function CountComm($id) {
 
  $this->db->prepare('SELECT COUNT(*) FROM commentaires WHERE id_news = {1}', $id);
  $this->db->query();

  $data = $this->db->fetch_row();
  return ( (int) $data[0] );
 
 }

// Ajoute un commentaire sur une news.
 public function AddComm($pseudo, $content, $id) {
  
  unset($this->output);
  
  $this->db->prepare("INSERT INTO commentaires (pseudo, content, id_news, ip, date) VALUES ('{1}', '{2}', {3}, '{4}', NOW() )",
	                  $pseudo, $content, $id, $_SERVER['REMOTE_ADDR']);
  $this->db->query();

   if ( $this->db->affected_rows() === 1 ) {
        $this->output = $this->db->insert_id();
		return true;
   } else {
        return false;
   }
   
 }

// Ajoute une news
// Retourne TRUE/FALSE en fonction de l'insertion dans la BDD 
 public function AddNews($titre, $resume, $content) {
 
  unset($this->output);
  
  $this->db->prepare("INSERT INTO news (titre, resume, content, date) VALUES ('{1}', '{2}', '{3}', NOW() )",
                      $titre, $resume, $content);
  $this->db->query();
  
   if ( $this->db->affected_rows() === 1 ) {
        $this->output = $this->db->insert_id();
		return true;
   } else {
        return false;
   }

 }
 
// Update une news
 public function UpdateNews($titre, $resume, $content, $id) {
 
  $this->db->prepare("UPDATE news SET titre = '{1}', resume = '{2}', content = '{3}' WHERE id = {4}",
                      $titre, $resume, $content, $id);
                      
   if ( $this->db->affected_rows() === 1 ) {
        $this->output = $this->db->insert_id();
		return true;
   } else {
        return false;
   }
 
 
 }
 
// Récupère l'ID qui va être inscrit dans la BDD
 public function LastIDNews() {
 
  $this->db->query('SELECT MAX(id)+1 FROM news');
  
  $data = $this->db->fetch_row();
  return ( (int) $data[0] ) ;
  
 }

// Fin d'objet 
 public function __destruct() {
  unset($this->output);
 }
 
}
?>
<?php
CREATE TABLE `news` (
  `id` int(11) NOT NULL auto_increment,
  `titre` varchar(255) NOT NULL,
  `resume` varchar(255) default NULL,
  `content` text NOT NULL,
  `date` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM

// Le timestamp peut être changé par un INT(11) ou un champ DATETIME ou autre :)

CREATE TABLE `commentaires` (
  `id` int(11) NOT NULL auto_increment,
  `pseudo` varchar(255) NOT NULL,
  `content` text NOT NULL,
  `date` datetime NOT NULL,
  `id_news` int(11) NOT NULL,
  `ip` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM

?>
<?php
// Utilisation :
$news = new News;
// Je récupère les 10 dernières news ainsi que le nombre de commentaire sur chaque news.
$news->GetNews(0,10,'count');
 foreach ( $news->output as $data ) {
   // $code à l'intérieur :)
   // Ca reste de la mise en page
 }
?>

 Conclusion

Voila, reste plus qu'à faire mumuse avec les autres méthodes.
Ca marche sur le même principe :
$news->method($args);
foreach ( $news->output as $data ) { // }

Sauf certaines méthodes qui renvoient d'autres choses en plus :)
C'est du basique, je compte l'améliorer prochainement... Mais alors comment :o


 Sources du même auteur

PHP5 - UTILISATION DES ITÉRATEURS ET DE LA RÉFLECTION.
PHP 5 - CLASSE MYSQL (STYLE MYSQLI)
[PHP5] CLASSE DATE/HEURE
PHP5 - GESTION DE MODULES EN OBJET
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES

 Sources de la même categorie

Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan
Source avec Zip POO - FACTORY CLASS par Waredan
POO - SINGLETON CLASS par Waredan
POO - PARAMETERHOLDER CLASS par Waredan

 Sources en rapport avec celle ci

CLASS RECHERCHE PHP5 POO par mtrix000
CLASS AUTHENTIFICATION PHP5 POO par mtrix000
PHP5 - CLASSE DE NEWS ET DE COMMENTAIRES par FhX
Source avec Zip SYSTEME DE NOUVELLE POO par hametsu21
PHP5 - CLASSE DE PAGINATION MODULABLE par FhX

Commentaires et avis

Commentaire de FhX le 22/04/2006 15:36:43

J'ai oublié de dire que j'utilise ma classe Mysql dispo sur ce site.
(quoi que, je l'ai modifié depuis...)

Ca reste lisible malgrès tout !

Commentaire de GiUsTiNo le 23/04/2006 12:53:04

tu fais chier !!! ^^  non je blague :D
remet quand même ta classe mysql ici qu'on ne se fatigue pas à la chercher :p
Sinon on devine ce que tes fonctions de la classe mysql font et dans l'ensemble ca m'a l'air pas mal et assez complet pour un petit système de news...
C'est sur qu'on peut toujours trouver qqchose à rajouter, à voir :)

Bonne continuation

Giustino

Commentaire de alain04 le 24/04/2006 13:01:04

Slt,
Quand on donne un script pour DEBUTANT, il serait souhaitable que ce soit compréhensible ... par les débutants (dont je suis bien sûr)
Si je souhaite utiliser ce script et que je fait un copier/coller, il ne se passe rien du tout (et pour cause! je n'ai aucune explication quand à l'utilisation.)
Alors ce petit post s'adresse aussi à tout les nombriliste qui oublient façilement qu'ils ont été, un jour, eux aussi DEBUTANT.

Commentaire de FhX le 24/04/2006 14:51:48

Heu, un débutant, c'est pas seulement le gars (ou la fille) qui fait un copier/coller du code bêtement ... :/

Aller, je détaille :

abstract class Objet { } // Me permet de gérer ma classe News ( initialisation de la base de donnée (que je n'ai pas fourni ici) )

class News extends Objet { } // Ma classe de news.
Examinons :

# // Supprime une news
# // Retourne un booléen : TRUE/FALSE
#  public function DeleteNews($id) {
J'ai oublié de dire que $id doit être un INT ?

public function CountNews() { } // Manque d'explication sur la fonction ? Rien que le nom de la méthode me parait explicite !

public function GetUniqueNews($id) { } La c'est pareil, je récupère les infos que d'une seule news via son numéro ID.

#  // $start => début de la requète
# // $limit => Nombre d'enregistrement max
#  // $comm => Active la récupération des commentaires ou non
#  public function GetNews($start = 0, $limit = 30, $comm = 'count') { }
Peut être le plus dur de ma classe. Je récupère un certain nombre de news, compris entre $start et $limit.. et j'active ou non la récupération des commentaires de la news via $comm.

# // Récupére les commentaires d'une news
# // Retourne le nombre de commentaires
#  public function GetComm($id, $start = 0, $limit = 10) { }
Pareil ici, je récupère les commentaires pour 1 news via l'ID de la news. $start et $limit me permette de choisir le nombre de commentaires à afficher.

... Le reste est assez explicite je crois non ?


Il te faut encore de l'explication ?
Tu veux récupérer... disons les 10 dernieres news :
<?php
$news = new News; // Instanciation de classe.
$news->GetNews( $start = 0, $limit = 10) );
?>
Voila, tu as récupéré tes 10 news. Mais où sont elles ? Si tu regardes bien, j'ai une propriété de classe qui s'appèle $output.
$output est un tableau qui contient mes infos. Donc, pour parcourir ce tableau ==> un coup de foreach();

<?php
foreach ( $news->output as $key ) {
       echo $key['titre']; // Pour le titre de la news;
       echo $key['content']; // Pour le contenu
       echo $key['date']; // pour la date etc...
}
?>
Après tout dépend de ce que tu récupères ... ca se passe dans tes query().
Mais comme j'ai pas inclus ma classe SQL, la source tel-quel ne peut pas marcher.

En même temps, jdemande à personne de pomper sans rien comprendre derrière.
Mais si tu veux des explications, je peux toujours essayer de te les donner.

Commentaire de alain04 le 24/04/2006 16:11:27

Entièrement d'accord avec toi. En fait j'ai écrit "copier/coller" comme exemple, et non pas (bêtement?) comme action. Celà dit, un débutant, ça cherche à comprendre, et pour celà il faut des détails dans les explications. Je comprends bien que ton rôle, comme celui des autres posteurs de ce très bon site, n'est pas 'forcément' celui d'un pédagogue, mais je me permet de maintenir, et ce en toute bonne cordialité, que si le niveau d'un script est donné pour débutant, la moindre des choses c'est que le "débutant" puisse le mettre en oeuvre.
Merci en tout cas d'avoir répondu, c'est bon exemple de sincérité qu'il faut souligner.
Alain

Commentaire de FhX le 24/04/2006 16:52:41

C'est vrai, tu as raison sur le point du débutant... le seul problème, c'est que je ne peux pas mettre cette source en tant qu'initié simplement parce que c'est orienté objet. Donc je me retrouve un peu au pied du mur.

Mais tu as quand même raison, quand on poste quelque chose, on se doit de le documenter un minimum pour les autres.

Je m'attache à la tache quand je le pourrais ! Merci de la remarque :)

Commentaire de hametsu21 le 08/05/2006 17:14:56

En relation avec une gestion des membres POO (voir le tutorial de FHX) comment démarquer les méthodes reservées à l'administration ajout/supprime/edite et à tous les visiteurs lister les news/ajouter un commentaire/... sans pour autant que se soit "bordelique" un morceau de poo news dans les class de gestions d'utilisteur par exemple ?
A+

Commentaire de elidris le 27/05/2006 13:36:06

Salut,
je decouvres tout ca aujourd'hui, mais je ne comprend rien (lol), il  faudrais que j'arrive a le faire fonctionner pour comprendre, j'ai créé la base de donnée avec le bout de code <?php CREATE TABLE....?>
mais je ne vois pas comment m'y connecter. d'habitude j'ai un truc genre include('connect.php') !!! quand je lance le fichier j'ai une erreur : Parse error: parse error, unexpected T_CLASS in W:\www\intoxitation\test_classe.php on line 2

et en ligne 2 j'ai : abstract class Objet {

comme vous voyez j'ai rien compris....
si vous pouvez m'aiguiller.
Merci

Commentaire de leknoppix le 20/06/2008 17:03:37

Sa ne marche pas chez moi.

Commentaire de m54 le 08/02/2009 14:01:53 6/10

Chez moi ca marche moyen, et en un fichier c'est simple d'accord mais même peut être trop

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Class POO retourné le nom de l'objet [ par MeTh ] Bonjour,Comment retourné le nom de l'objet déclaré?exemple :$monobjet = new GridR();comment recuperé $monobjet dans ma class?Merci requête count [ par Tomcube ] Salut !J'ai une table news avec mes news, une table commentaires où sont stockés les commentaires de ces news. Dans ma page de news (qui en affiche 30 Problème affichage de la commentaires [ par dyto ] bonjour les zéros, mon probleme c que je fai un tuto, et il y 2 champs, et kon on les remplies, il l'ajoute dans la bdd et l'affiche dans en haut, com Ajouter des commentaires a des news [ par jeromeke ] Bonjour,je suis à la recherche d'un script qui explique comment ajouter des commentaires à des news.Merci d'avance.Jérôme Compteur de nombre de commentaires posté pour une news [ par jeromeke ] Voila je comprend pas trop le principe alors si qqun pourrait m'aider je serais ravis!Merci d'avance,Jérôme templates avec poo [ par lesnes ] bonjours je reprogramme totalement mon site en poo et je souhaiterai utiliser les templates mais l'on ne peut pas faire appel a une class exterieur a news [ par tomm123456 ] bonjour et joyeuses fetes . voil&#224; j'ai un probleme de mise &#224; jour de news .Quand je veux modifier une news , il me renvoie bien les vale Probléme avec GET_PAGE [ par matrixscript59 ] donc voicie mon probléme quand je regarde les commentaire de mais news  il veut pas me affiché la page 2 ou 3 etc... quand je clic sur 2 il me envoye [POO] Une classe dans une classe [ par Mrreivax ] Bonsoir.Et bien voila. J'ai créé une classe de gestion des images.J'ai par la suité créé une autre classe de gestion de banières.Mais, cette dernière Pb avec la class de news de FhX [ par acidline ] Bonjour à tous,Je me présente, je m'appelle Nicolas, j'ai 24ans et la POO en PHP est nouveau pour moi.Je me suis mis en tête d'utiliser la class de ne


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales