IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Fonction gestion des commentaires


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut Fonction gestion des commentaires
    Bonjour,

    J'ai fait une fonction qui me permet de créer des commentaires et des commentaires de commentaire (notion de recursivité) mais aussi de supprimer et de modifier son commentaire

    Le problème est que la récursivité fonctionne une seule fois, sauriez-vous pourquoi ? (cf pièce jointe)

    Nota, si vous souhaitez épurer le code c'est avec plaisir !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    	$array_commentaire = array();
    		while ($tab_data_comment = $sql_data_comment->fetch())
    		{	
    			$array_commentaire[$tab_data_comment['id']]['titre']= stripslashes(htmlspecialchars($tab_data_comment['titre'])); 
    			$array_commentaire[$tab_data_comment['id']]['contenu']= stripslashes($tab_data_comment['contenu']); 
    			$array_commentaire[$tab_data_comment['id']]['pseudo']= stripslashes(htmlspecialchars($tab_data_comment['pseudo'])); 
    			$array_commentaire[$tab_data_comment['id']]['timestamp']= intval($tab_data_comment['timestamp']); 
    			$array_commentaire[$tab_data_comment['id']]['type_comment']= intval($tab_data_comment['type_comment']); 
    			$array_commentaire[$tab_data_comment['id']]['identifiant_comment']= intval($tab_data_comment['identifiant_comment']); 
    			$array_commentaire[$tab_data_comment['id']]['message_cite']= intval($tab_data_comment['message_cite']); 
    			$array_commentaire[$tab_data_comment['id']]['id_user']= intval($tab_data_comment['id_user']); 		
    			$array_commentaire[$tab_data_comment['id']]['type_balade']= intval($tab_data_comment['type_balade']); 	
    			$array_commentaire[$tab_data_comment['id']]['id']= intval($tab_data_comment['id']);
    		}
     
    		//debut fonction
    		function afficher_commentaire($identifiant_comment, $array_commentaire,$cite = false)
    		{
    			$contenu = $array_commentaire[$identifiant_comment]['contenu'];
    			$id_message_cite = $array_commentaire[$identifiant_comment]['message_cite'];
    			$type_comment = $array_commentaire[$identifiant_comment]['type_comment'];
    			$id_maj_supr_comment = $array_commentaire[$identifiant_comment]['identifiant_comment'];
    			$type_balade = $array_commentaire[$identifiant_comment]['type_balade'];
    			$id = $array_commentaire[$identifiant_comment]['id'];
    			$timestamp = $array_commentaire[$identifiant_comment]['timestamp'];
    			$pseudo = $array_commentaire[$identifiant_comment]['pseudo'];
     
    			echo '<div class="componentheading_categorie">';
    				echo stripslashes($array_commentaire[$identifiant_comment]['titre']);			
    			echo' <span class="quote_droite">';
     
    			//si connecté
    			if (Fsb::$session->is_logged())
    			{
    				$id_user = $array_commentaire[$identifiant_comment]['id_user'];
     
    				//si c'est pas son message
    				if (Fsb::$session->id() != $id_user )
    				{
    					//il peut citer
    					if(!$cite)
    					{
    						//si il à déjà cité le message, on ne lui laisse pas quoter une seconde fois
    						$racine = $_SERVER['DOCUMENT_ROOT'];
    						include ($racine.'/inclusion/connect_pdo.php');
    						$sql_unique = $bdd->prepare('SELECT * from comment where message_cite IN(select id from comment) and message_cite = ?');
    						$sql_unique->execute(array($id));
    						$tab_unique = $sql_unique->fetch();
     
    						$message_unique = $tab_unique['message_cite'];
    						if($message_unique == $id_message_cite)
    						{
    							echo' <a href="/php/commentaires/moi/rediger_commentaire.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'&amp;commentaire_cite='.$identifiant_comment.'';
     
    							if($type_balade == 0 OR $type_balade == 1)
    							{
    								echo'&amp;type_balade='.$type_balade.'';
    							}
    							echo' " title="Citer le commentaire" target="_self"><img src="/php/commentaires/images/quote.gif" title="Citer le commentaire"></a>';	
    						}
     
    					}	
    				}
     
    				//c'est son message
    				if (Fsb::$session->id() == $id_user OR Fsb::$session->data['u_auth'] == 5 OR Fsb::$session->data['u_auth'] == 4 )
    				{
    					//rien dans les messages cités
    					if(!$cite)
    					{	
    						//suppresion ok
    						echo' <a href="/php/commentaires/moi/liste_commentaire.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'';
     
    						if($type_balade == 0 OR $type_balade == 1)
    						{
    							echo'&amp;type_balade='.$type_balade.'';
    						}
    						echo'&amp;id_com_a_supprimer='.$identifiant_comment.'';
     
    						if(!empty($id_message_cite))
    						{
    							echo'&amp;commentaire_cite='. $id_message_cite .'';
    						}
    						echo'" title="Supprimer le commentaire" target="_self" onclick="return confirm(\'Etes vous sur de vouloir supprimer ce commentaire ?\');"><img src="/php/commentaires/images/delete.gif" title="Supprimer le commentaire"></a>';
     
    						//editer le commentaire
    						echo' <a href="/php/commentaires/moi/rediger_commentaires.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'';
    						if($type_balade == 0 OR $type_balade == 1)
    						{
    							echo'&amp;type_balade='.$type_balade.'';
    						}
    						//si modif, on passe l'id message qui à été cité si il y en a
    						if(!empty($id_message_cite))
    						{
    							echo'&amp;commentaire_cite='. $id_message_cite .'';
    						}
     
    						echo'&amp;id_message_a_editer='.$identifiant_comment.'" title="Editer le commentaire" target="_self"><img src="/php/commentaires/images/edit.gif" title="Editer le commentaire"></a>';
    					}
    				}	
    			}
     
    			echo'</span>';	
    			echo'</div>';
     
    			//recursive si c'est un message cité
    			if (!empty($id_message_cite))
    			{
    				echo'<blockquote class="cadre_forum">';
    				echo '<div class="citer">';
     
    					afficher_commentaire($id_message_cite, $array_commentaire, true);
     
    				echo '</div>';				
    				echo'</blockquote><br />';
    			}
     
    			echo $contenu;
    			echo'<p class="spacer"></p>';
     
    			echo'<span class="poste_par">';
    			echo'Posté le '.date('d/m/Y à H\hi',$timestamp). ' par <strong>'.$pseudo.' </strong>';  
    			echo'</span>';
    		}
    		//fin fonction
     
    		//on lance la fonction
    		foreach ($array_commentaire as $id => $value)
    		{
    			afficher_commentaire($id,$array_commentaire);
    		}

    Par avance un grand merci à qui saura m'aider

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello

    Je suis en train de faire un module de blog pour mon framework. Si tu veux, je te filerai quelques sources du module pour que tu te fasse un idée (je devrais avoir fini entre aujourd'hui et demain). Ce sera en Objet mais dans ce cas de figure (aggrégation d'articles et de commentaires) c'est la solution la plus appropriée.

    N'hésite pas à me PM pour en savoir plus ou savoir où j'en suis sinon je risque de t'oublier.

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Hello,

    C'est gentil merci, mais n'hésite pas à me corriger aussi sur ce morceau de code ;-)


  4. #4
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je n'arrive pas à rentrer dans ton algorithme, je pense que beaucoup de chose inutiles peuvent être retirées mais pour ça je dois voir ton schéma de tables.

    Tu peux me passer les tables ?

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Tu veux des backup ou juste la structure ?

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    La structure.

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    La voici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    -- 
    -- Structure de la table `comment`
    -- 
     
    CREATE TABLE `comment` (
      `id` bigint(20) NOT NULL auto_increment,
      `titre` text collate latin1_german2_ci NOT NULL,
      `contenu` text collate latin1_german2_ci NOT NULL,
      `pseudo` varchar(20) collate latin1_german2_ci NOT NULL,
      `timestamp` bigint(20) NOT NULL,
      `identifiant_comment` bigint(20) NOT NULL,
      `type_comment` bigint(20) NOT NULL,
      `type_balade` bigint(20) NOT NULL,
      `id_user` int(11) NOT NULL,
      `message_cite` int(11) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=305 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci AUTO_INCREMENT=305 ;
    peut-être te faudrait-il le fichier pour rédiger et le fichier de traitement en entier pour cerner le tout ?

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bon finalement, ça fonctionne à peu près maintenant. (cf ici)


    J'aimerais faire en sorte de ne pas laisser à l'utilisateur le pouvoir de citer deux fois le même message.


    ça ce joue ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    //si connecté
    			if (Fsb::$session->is_logged())
    			{
    				$id_user = $array_commentaire[$identifiant_comment]['id_user'];
     
    				//si c'est pas son message
    				if($id_user != Fsb::$session->id())
    				{
    					//essayer de trouver pour interdire de citer deux fois le même message
    if(????)
    					if(!$cite)
    					{
    						echo' <a href="/php/commentaires/moi/rediger_commentaire.php?type_comment='.$type_comment.'&amp;identifiant_comment='.$id_maj_supr_comment.'&amp;commentaire_cite='.$identifiant_comment.'';
     
    						if($type_balade == 0 OR $type_balade == 1)
    						{
    							echo'&amp;type_balade='.$type_balade.'';
    						}
    						echo' " title="Citer le commentaire" target="_self"><img src="/php/commentaires/images/quote.gif" title="Citer le commentaire"></a>';	
    					}
     
    				}
    			}
    une idée ?

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Voici ce à quoi ça peut ressembler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <?php
     
    function load_comment ($id, PDO $bdd) {
        $query = "SELECT * FROM `comment` where `id`=:id OR `message_cite`=:id";
        $stmt = $bdd->prepare($query);
     
        if (!$stmt->execute(array(':id' => $id)))
            return false;
     
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
        $comment = array('children' => array());
        foreach ($stmt as $row) {
            if ($row['id'] == $id) {
                $comment += $row;
            }
            else {
                // si on veut réccupérer l'arbre entier on a pas tellement le choix...
                $comment['children'][] = load_comment($row['id']);
            }
        }
     
        return $comment;
    }
     
    function display_comment ($comment) {
        $buffer = 
        	"<div class=\"comment\">".
            "<h2>{$comment['titre']}</h2>".
            "<p>{$comment['contenu']}</p>";
     
        foreach ($comment['children'] as $child_comment) {
            $buffer .= display_comment($child_comment);
        }
        return $buffer .= "</div>";
    }
     
     
    // ce serait mieux de savoir ou on se situe à ce niveau...
    $racine = $_SERVER['DOCUMENT_ROOT'];
    include ($racine.'/inclusion/connect_pdo.php');
     
    if (isset($_GET['comment_id'])) {
        if ($comment = load_comment($_GET['comment_id'], $bdd)) {
            echo display_comment($comment);
        }
        else {
            echo "Je me suis vautré en chargeant les commentaires...";
        }
    }
    else {
        echo "Y'a pas de commentaire à afficher...";
    }
    Pour l'affichage en cascade, un regle CSS toute simpel peut faire l'affaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    .comment > .comment {
      margin-left: 20px;
    }
    A toi de peaufiner

  10. #10
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Ouille ouille ouille ! Pourrais-tu un peu expliquer ? Parce qu'après une lecture intensive, je ne suis pas sûr de pouvoir adapter à mon fichier existant.

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    La seule chose à adapter là dedans c'est la fonction display_comment pour qu'elle formatte correctement un commentaire pour l'affichage.

    La fonction load_comment va chercher un commentaire en base de données et va créér l'arbre des commentaires associés à celui-ci (réccursivement).
    La fonction display_comment va ensuite lire cet arbre et le transformer en flux xhtml le plus simplement du monde.

  12. #12
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonsoir,

    Je reviens à l'assaut à propos de ton code Benjamin.

    En effet, j'ai revu ma modélisation et re-développe complétement mon site Internet.

    Ceci implique donc la modification du code de listing recursif des commentaires et des commentaires commentés.

    Pourrais-tu s'il te plaît m'aider à adapter les fonctions qui tu avais produites il y a quelques mois.

    Ci-joint, tu trouvera le MPD de ma base de données :




    Si tu as des questions, n'hésite pas !

    Un très grand merci pour ton aide.

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'ai une question: c'est quoi ton logiciel de modélisation ? Je ne le connais pas celui-ci, personnellement j'utilise MySQL WorkBench

    Juste une chose, tu connais la POO en PHP ? ça te serait sacrément utile dans ton cas

  14. #14
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Bonsoir,

    J'ai une question: c'est quoi ton logiciel de modélisation ? Je ne le connais pas celui-ci, personnellement j'utilise MySQL WorkBench
    L'outil de modélisation c'est powerAMC. Gratuit pendant 1 mois.

    Juste une chose, tu connais la POO en PHP ? ça te serait sacrément utile dans ton cas

    Oui je connais mais je n'ai pas eu encore le courage de m'y mettre. J'ai la bible du php 5 avancé sur ma table de chevet. Ca va venir petit à petit même si j'ai des difficultés à conceptualiser la chose.

    Pour l'instant, je fais tout sans POO et ça me va assez bien. Ce sera pour un partir-en-vtt V4 que je passerai en POO

    Par-contre, je suis bien passé en PDO pour mes requêtes .

  15. #15
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Passer tes modèles en Objet n'est pas bien compliqué.

    Voici quelques classes qui pourraient grandement t'aider:
    - https://github.com/bdelespierre/php-...base.class.php
    - https://github.com/bdelespierre/php-...ator.class.php
    - https://github.com/bdelespierre/php-...odel.class.php
    - https://github.com/bdelespierre/php-...ject.class.php

    Une fois installées, c'est vraiment simple de faire des modèles CRUD. Exemple avec la classe article de ton modèle de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
     
    class Article extends MySQLObject {
     
      public function __construct ($id = null) {
        parent::__construct('Article', $id);
      }
     
      public static function getArticles (array $search_params = array(), array $options = array()) {
        return parent::all('Article', $search_params, $options, new self);
      }
     
      public function getComments () {
        if (empty($this->_data))
           return false;
        return Comment::getComments(array('id_article' => $this->id));
      }
     
      // autres méthodes utiles
     
    }
    Et pour l’utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    $article = new Article(123);
    $article->body = "Un corp d'article...";
    $article->update();
     
    // voir des commentaires
    foreach ($article->getComments() as $comment) {
      echo $comment->body;
    }
    ça te dis d'aller dans cette voie ?

  16. #16
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Passer tes modèles en Objet n'est pas bien compliqué.

    Voici quelques classes qui pourraient grandement t'aider:
    - https://github.com/bdelespierre/php-...base.class.php
    - https://github.com/bdelespierre/php-...ator.class.php
    - https://github.com/bdelespierre/php-...odel.class.php
    - https://github.com/bdelespierre/php-...ject.class.php

    Une fois installées, c'est vraiment simple de faire des modèles CRUD. Exemple avec la classe article de ton modèle de données:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
     
    class Article extends MySQLObject {
     
      public function __construct ($id = null) {
        parent::__construct('Article', $id);
      }
     
      public static function getArticles (array $search_params = array(), array $options = array()) {
        return parent::all('Article', $search_params, $options, new self);
      }
     
      public function getComments () {
        if (empty($this->_data))
           return false;
        return Comment::getComments(array('id_article' => $this->id));
      }
     
      // autres méthodes utiles
     
    }
    Et pour l’utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php
     
    $article = new Article(123);
    $article->body = "Un corp d'article...";
    $article->update();
     
    // voir des commentaires
    foreach ($article->getComments() as $comment) {
      echo $comment->body;
    }
    ça te dis d'aller dans cette voie ?
    Salut,

    Merci pour la proposition, c'est sûr que c'est intéressant, puissant, évolutif.

    Maintenant, je pense quelques mois de plus me seront nécessaires pour me lancer dans un tel système. Je me concentre sur le re-développemment de l’entièreté de mon site et c'est assez urgent.

    Je préfère donc dans un premier temps mettre en ligne la nouvelle mouture puis la stabiliser et y apporter des nouveautés.

    Ensuite, je passerai à la POO car c'est à coup sûr l'avenir de PHP

    Sinon, concernant cet partie ajout de commentaires tu peux me filer un coup de main ?

    Merci encore.

  17. #17
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Alors tu peux me rappeler ce qu'il te manque exactement et ce que tu veux arriver à faire ?

    Au passage donne-moi une version SQL de ton Schéma.

  18. #18
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Ce que je souhaite faire, c'est avoir une fonction capable de recréer l'arbre des commentaires par article.

    Un commentaire peut être commenté et un commentaire qui commentait peut être commenté (récursivité).

    Niveau affichage HTML, il faut donc être en mesure d'afficher cet arbre via la balise blockquote.

    Ci-joint, la partie SQL du MPD

    Un grand merci pour le coup de main
    Fichiers attachés Fichiers attachés

  19. #19
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Sans avoir testé voici ce à quoi ça peut ressembler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    <?php
     
    /**
     * Get all comments attached to an article
     *
     * @param PDO $pdo                The database connection
     * @param integer $id             The article ID
     * @param array $search_params    [optionnal] Additionnal search parameters 
     * @param array $options          [optionnal] Additionnal query optiopns (GROUP BY and/or LIMIT)
     * @throws InvalidArgumentException
     * @throws RuntimeException
     * @return array
     */
    function get_article_comments (PDO $pdo, $id, array $search_params = array(), array $options = array()) {
    	// Parameters validation
    	if ($pdo === null)
    		throw new InvalidArgumentException("First parameter is expected to be a valid PDO ressource object, null given");
     
    	if ($id === null)
    		throw new InvalidArgumentException("Second parameters is expected to be a valid Article ID, null given");
     
    	// Fetch Comments Query Generation
    	$query = "SELECT id_commentaire,u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp ".
    			 "FROM pevtt_commentaire AS c ".
    			 "JOIN pevtt_commentaire_article AS ca ON (ca.`id_commentaire`=c.`id_commentaire`)".
     
    	// Where Clause Construction
    	$where_clause = array('id_article' => $id);
    	foreach ($search_params as $field => $search_value) {
    		$where_clause[] = "`{$field}`=:{$field}";
    	}
     
    	$query .= " WHERE " . implode(" AND ", $where_clause);
     
    	// Query Options (only ORDER BY and GROUP BY)
    	if (!empty($options)) {
    		if (isset($options['ORDER BY']))
    			$query .= " ORDER BY `{$options['ORDER BY']}`";
    		if (isset($options['LIMIT'])) {
    			if (is_scalar($options['LIMIT']) && $options['LIMIT'])
    				$query .= " LIMIT {$option['LIMIT']}";
    			if (is_array($options['LIMIT']))
    				$query .= " LIMIT " . implode(',', $options['LIMIT']);
    		}
    	}
     
    	// Prepare
    	$stmt = $pdo->prepare($query);
     
    	// Execute
    	if (!$stmt->execute($search_params))
    		throw new RuntimeException("Error with query: {$query}");
     
    	$comments = array();
    	while ($comment = $stmt->fetch(PDO::FETCH_ASSOC)) {
    		try {
    			// here the magic occurs !
    			$comment['children'] = get_child_comments($pdo, $comment['id_commentaire']);
    		}
    		catch (Exception $e) {
    			$comment['children'] = null;
    			trigger_error("Unable to retrieve child comments for {$comment['id_commentaire']}. Reason: {$e->getMessage()}");
    		}
    		$comments[] = $comment;
    	}
     
    	return $comments;
    }
     
    /**
     * Get all children of a given comment
     *
     * Note: if the depth parameter is greater than 1
     *       it will retrieve the children until the
     *       max depth is reached.
     * 
     * @param PDO $pdo              The database connection object
     * @param integer $parent_id    The parent comment id
     * @param integer $depth        [optionnal] The max depth to reach
     * @throws InvalidArguemntException
     * @throws RuntimeException
     * @return array
     */
    function get_child_comments (PDO $pdo, $parent_id, $depth = 10) {
    	// Do not go deeper than orignal depth parameter value
    	// Prevents an infinite reccursivity
    	if ($depth == 0)
    		return null;
     
    	// Parameters Validation
    	if ($parent_id === null)
    		throw new InvalidArgumentException("Second parameter is expected to be integer, null given");
     
    	// Query Generation
    	$query = "SELECT id_commentaire,u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp ".
    			 "FROM pevtt_commentaire AS c ".
    			 "JOIN pevtt_commentaire_commente AS cc ON (cc.id_commented=c.id_commentaire) ".
    			 "WHERE cc.id_commentant=:parent_id";
     
    	// Query Execution
    	$stmt = $pdo->prepare($query);
    	if (!$stmt->execute(array('parent_id' => $parent_id))
    		throw new RuntimeException("Error with query: $query");
     
    	// No Children Found
    	if (!$stmt->rowCount())
    		return null;
     
    	// Fetch children's children (Inception Coding-Style duh...)
    	$children = array();
    	while ($child = $stmt->fetch(PDO::FETCH_ASSOC)) {
    		try {
    			$child['children'] = get_child_comments($child['id_commentaire'], $depth-1);
    		}
    		catch (Exception $e) {
    			$child['children'] = null;
    			trigger_error("Unable to retrieve child comments for {$child['id_commentaire']}. Reason: {$e->getMessage()}");
    		}
    		$children[] = $child;
    	}
     
    	return $children;
    }
    ça doit génerer un arbre avec pour chaque commentaire un index "children" qui contiens soit null (aucun enfant) soit un tableau avec les enfants (qui eux mêmes ont des enfants etc.)

    Si on avait fait ça en objet on aurait pu mettre en cache les statements mais là, à moins de les coller dans GLOBALS je vois pas bien comment faire...

  20. #20
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Tu codes plus vite que ton ombre !

    J'ai essayé de comprendre un peu le fonctionnement, sans trop de résultat.

    Pourrais-tu m'expliquer les grandes composantes et aussi comment utiliser l'ensemble par exemple pour l'article N°1, paramètre que je récupère via un $_GET['id_article'].

    Aussi, comment modifier la chose pour que les fonctions utilises ma connexion PDO.
    Sachant que je me connecte de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    	try
    	{
    		$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    		$bdd = new PDO('mysql:host=host;dbname=name', 'user', 'password.', $pdo_options);
    	}
    	catch (Exception $e)
    	{
    			die('Erreur : ' . $e->getMessage());
    	}
    ?>
    Par avance, merci.

Discussions similaires

  1. Probléme Modélisation - Gestion des Commentaires
    Par Pioul dans le forum Schéma
    Réponses: 5
    Dernier message: 11/12/2008, 10h23
  2. Simplification d'une fonction - gestion des événements
    Par superpigeon dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 18/11/2008, 12h44
  3. Gestion des commentaires dans cellule
    Par INeedHelp dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/04/2008, 21h35
  4. [PhpDocumentor] Gestion des commentaires avec accents
    Par Nullos Oracle dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 18/09/2007, 11h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo