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 :

Exploitation d'un array imbriqué [MySQL]


Sujet :

PHP & Base de données

  1. #21
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    Alors a moins que tu n'es que deux message en fait ?


    dans ce cas il serait juducieux de mettre le message de réponse au premier dans le chidren du premier, et de ce fait obtenir

    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
    (
        [0] => Array
            (
                [id_commentaire] => 36
                [u_id] => 18
                [commentaire_titre] => Mon message
                [commentaire_timestamp] => 1298326740
                [children] => Array
                    (
                        [0] => Array
                            (
                                    [id_commentaire] => 37
                                    [u_id] => 2
                                    [commentaire_titre] => Un super Vercors
                                    [commentaire_timestamp] => 1298359980
                                    [u_nickname] => Loïc
                                    )
     
                    )
            )
     
     
     
    )

  2. #22
    Membre éclairé
    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
    Par défaut
    Oui, comme je l'ai dit juste avant, il n'y a que deux messages.

    • Le premier,
    • Le second avec pour children le premier message (celui qui est cité).



    Au niveau du rendu final, je voudrais donc que ce soit de cette manière :

    message un

    message deux

    Message trois
    -> Message cité (numéro 2)

    Message quatre
    ->Message cité (numéro 3)
    -->Message cité (numero 2)

    ...

  3. #23
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    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
    Class Commentaire_filter{
     
        static function view($arr, $open ){
     
     
            //on vérifie que l'on doit faire de l'affichage
            if(isset($arr['children'])){
     
            //A chaque début d'un message commenté on ouvre un <blockquote>
                if($open>0){
                    echo "<blockquote>";
                }
            //on ecrit
            echo "<h2>".$arr['commentaire_titre']."</h2>";
            echo "<p>".$arr['commentaire_contenu']."</p>";
     
             //Si c'est le dernier message d'un bloc
                if($arr['children']==""){
                    //on ferme les <blockquote> ouverts
                    for( $i=0;$i<$open;$i++){
                        echo "</blockquote>";
                    }
                    //on reinitialise
                    $open=0;
                }
     
     
            }
            //On regarde si le prochain message est un message commenté
            if(  isset($arr['children'][0]) && is_array($arr['children'][0])){
            $open++;  
            }
            //on boucle
            foreach ($arr as $k ){
                        if(is_array($k)){
                           // print_r($k);
                              Commentaire_filter::view($k, $open );
                         }
            }
        }
    }
     
     Commentaire_filter::view($Commentaire,0) ;

    bon j'ai pas trouvé mieux..

  4. #24
    Membre éclairé
    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
    Par défaut
    Bonjour,

    Merci de m'aider ainsi

    http://partir-en-vtt.com/php/article...ommentaire.php

    Étonnamment, seul une ligne apparait

    Une idée du pourquoi ?

    Merci !

  5. #25
    Membre éclairé
    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
    Par défaut
    En supprimant la condition si-dessous qui était trop restrictive, les deux messages + celui cité apparaissent.

    Cependant, le blockquote n'englobe pas le message cité.

    Condition supprimée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     //on vérifie que l'on doit faire de l'affichage
      if(isset($arr['children'])){
    }
    Résultat toujours visible sur :

    http://www.partir-en-vtt.com/php/art...ommentaire.php

  6. #26
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    En réalité, le retour des deux fonctions que je t'ai faites permet une imbrication infinie des commentaires. Donc le seul bon moyen d'afficher correctement les données est d'utiliser un algorithme récursif.

    Voici à quoi ça peut ressembler concrêtement:
    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
    function display_comments (array $comments) {
      if (empty($comments))
        return '';
     
      foreach ($comments as $comment) {
        $res .= '<div class="commentaire">';
        $res .= '<h3>Commentaire de ' . $comment['u_nickname'] . '</h3>';
        if (isset($comment['children']))
          $res .= display_comments($comment['children']);
        $res .= '<p>' . $comment['body'] . '</p>';
        $res .= '</div>';
      }
     
      return $res;
    }
    Arrange ça comme tu veux pour l'ordre d'affichage et peaufine avec une règle
    CSS de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    .commentaire {
      /** style d'un commentaire **/
    }
     
    .commentaire .commentaire {
      /** style d'un sous-commentaire **/
    }

  7. #27
    Membre éclairé
    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
    Par défaut
    Bonjour Benjamin et merci pour ton intervention car je moulinais dans la semoule.

    Je regarde et te tient au courant des avancées.

  8. #28
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    cela dit au moins tu n'aura plus qu'a choisir,

    mais cela fonctionne très bien ;

    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
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    <?php
     
    Class Commentaire_filter{
     
        static function view($arr, $open ){
     
     
            //on vérifie que l'on doit faire de l'affichage
            if(isset($arr['children'])){
     
            //A chaque début d'un message commenté on ouvre un <blockquote>
                if($open>0){
                    echo "<blockquote>";
                }
            //on ecrit
            echo "<h2>".$arr['commentaire_titre']."</h2>";
            echo "<p>".$arr['commentaire_contenu']."</p>";
     
             //Si c'est le dernier message d'un bloc
                if($arr['children']==""){
                    //on ferme les <blockquote> ouverts
                    for( $i=0;$i<$open;$i++){
                        echo "</blockquote>";
                    }
                    //on reinitialise
                    $open=0;
                }
     
     
            }
            //On regarde si le prochain message est un message commenté
            if(  isset($arr['children'][0]) && is_array($arr['children'][0])){
            $open++;  
            }
            //on boucle
            foreach ($arr as $k ){
                        if(is_array($k)){
                           // print_r($k);
                              Commentaire_filter::view($k, $open );
                         }
            }
        }
    }
     
     
     
    $Commentaire =
    Array(
           0  => Array
            (
                "id_commentaire" => 36,
                "u_id" => 18,
                "commentaire_titre" => "Mon message",
                "commentaire_contenu" =>   " super trek !!! ",
                "commentaire_timestamp" => 1298326740,
                "u_nickname" => "lolo",
                "children" => ''
            ),
            1  => Array
            (
                "id_commentaire" => 37,
                "u_id" => 2,
                "commentaire_titre" => "Un super Vercors",
                "commentaire_contenu" => " Salut,Super joli le Vercors. Nous pensons y retourner pendant lété car le calcaire y est superbe et les vues excellentes..",
                'commentaire_timestamp' => 1298359980,
                'u_nickname' => 'Loïc',
                'children' =>    Array
                                    (
                                         0  => Array
     
                                        (
                                            "id_commentaire" => 36,
                                            "u_id" => 18,
                                            "commentaire_titre" => "Mon message",
                                            "commentaire_contenu" =>   " super trek !!! ",
                                            "commentaire_timestamp" => 1298326740,
                                            "u_nickname" => "lolo",
                                            "children" => ''
                                        )
                                     )
            ),
     
            2  => Array
            (
                "id_commentaire" => 38,
                "u_id" => 25,
                "commentaire_titre" => "Oui super",
                "commentaire_contenu" => " C vrai, c'est joli le Vercors.",
                'commentaire_timestamp' => 1298359990,
                'u_nickname' => 'tata',
                'children' =>    Array
                                    (
                                        0 => Array
     
                                        (
                                            "id_commentaire" => 37,
                                            "u_id" => 2,
                                            "commentaire_titre" => "Un super Vercors",
                                            "commentaire_contenu" => " Salut,Super joli le Vercors. Nous pensons y retourner pendant lété car le calcaire y est superbe et les vues excellentes..",
                                            'commentaire_timestamp' => 1298359980,
                                            'u_nickname' => 'Loïc',
                                            'children' =>    Array
                                                                    (
                                                                        0 => Array
     
                                                                        (
                                                                        "id_commentaire" => 36,
                                                                        "u_id" => 18,
                                                                        "commentaire_titre" => "Mon message",
                                                                        "commentaire_contenu" =>   " super trek !!! ",
                                                                        "commentaire_timestamp" => 1298326740,
                                                                        "u_nickname" => "lolo",
                                                                        "children" => ''
                                                                        )
                                                                   )
                                        )                              
     
                                    )
            )
            ,
            3  => Array
            (
                "id_commentaire" => 39,
                "u_id" => 18,
                "commentaire_titre" => "Cool les mecs j'adore cette region",
                "commentaire_contenu" =>   " A vos vélos !!! ",
                "commentaire_timestamp" => 12983050505,
                "u_nickname" => "lolo",
                'children' =>    Array
                                    (
                                        0 => Array
     
                                                (
                                                "id_commentaire" => 38,
                                                "u_id" => 25,
                                                "commentaire_titre" => "Oui super",
                                                "commentaire_contenu" => " C vrai, c'est joli le Vercors.",
                                                'commentaire_timestamp' => 1298359990,
                                                'u_nickname' => 'tata',
                                                'children' =>    Array
                                                                    (
                                                                        0 => Array
     
                                                                        (
                                                                            "id_commentaire" => 37,
                                                                            "u_id" => 2,
                                                                            "commentaire_titre" => "Un super Vercors",
                                                                            "commentaire_contenu" => " Salut,Super joli le Vercors. Nous pensons y retourner pendant lété car le calcaire y est superbe et les vues excellentes..",
                                                                            'commentaire_timestamp' => 1298359980,
                                                                            'u_nickname' => 'Loïc',
                                                                            'children' =>    Array
                                                                                                    (
                                                                                                        0 => Array
     
                                                                                                        (
                                                                                                        "id_commentaire" => 36,
                                                                                                        "u_id" => 18,
                                                                                                        "commentaire_titre" => "Mon message",
                                                                                                        "commentaire_contenu" =>   " super trek !!! ",
                                                                                                        "commentaire_timestamp" => 1298326740,
                                                                                                        "u_nickname" => "lolo",
                                                                                                        "children" => ''
                                                                                                        )
                                                                                                   )
                                                                        )                              
     
                                                                    )
                                            )
                                        ) 
    )
        );
     
     
    ?>
     
    <html>
        <style>
            *{margin:0;padding:0;}
            p{margin:5px;padding:0;font-size:13px;}
            h2{margin:5px;font-size:14px;margin:0;padding:0;}
            blockquote{margin-left:15px;background:#ffd6d6;}
     
        </style>
        <body>
            <?php
            Commentaire_filter::view($Commentaire,0) ;
            ?>
       </body>
    </html>

  9. #29
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Quelle est la rééle plus-value dans le fait d'utiliser une classe ici ? Vu qu'elle ne porte qu'une méthode statique, elle se résume bien à une simple fonction récursive.

    En revanche, on peut s'inspirer de l'idée pour faire un helper d'affichage capable de décorer un objet Article par exemple, ce serait pas mal d'ailleurs, mais c'est pas le sujet.

  10. #30
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    oui tu a entièrement raison, c par habitude : je range tout dans des class;
    mais on peu très bien ne garder que la fonction...

    Donc une fonction récursive, 2 solutions, c pas mal pour un petit sujet...

    Note : dans la solution que tu proposes, tu ne vérifie pas le type de la variable qui soit y en en passant pose un problème dans le foreach lorsqu'il s'agit d'un string

  11. #31
    Membre éclairé
    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
    Par défaut
    Citation Envoyé par ascito Voir le message
    oui tu a entièrement raison, c par habitude : je range tout dans des class;
    mais on peu très bien ne garder que la fonction...

    Donc une fonction récursive, 2 solutions, c pas mal pour un petit sujet...

    Note : dans la solution que tu proposes, tu ne vérifie pas le type de la variable qui soit y en en passant pose un problème dans le foreach lorsqu'il s'agit d'un string
    Bonsoir et merci à vous deux !

    Je n'ai pas compris le problème que tu relèves dans la fonction de Benjamin. Peux-tu préciser ? Merci.

  12. #32
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $res .= display_comments($comment['children']);

    $comment['children'] peu etre de type string, dans la boucle cela ne passe pas au niveau de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    display_comments (array $comments)

  13. #33
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Citation Envoyé par ascito Voir le message
    Note : dans la solution que tu proposes, tu ne vérifie pas le type de la variable qui soit y en en passant pose un problème dans le foreach lorsqu'il s'agit d'un string
    Bof pas vraiment, il suffit de caster:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    foreach ((array)$anything as $piece) ...

  14. #34
    Membre éclairé
    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
    Par défaut
    Bonsoir,

    Je construit petit à petit le système de commentaire en utilisant les différentes fonctions que Benjamin m'a proposé.


    Jusqu'à présent tout va bien mais il y a un mais !

    En effet, j'arrive très bien à citer un commentaire une fois. Si je souhaite commenter un commentaire commenté, j'aimerais que l'arbre du premier commentaire commenté soit repris. Ainsi par exemple

    Commentaire 1 :

    -"Premier commentaire"

    Commentaire 2 commente le 1 :


    -"Premier commentaire"

    --Second commentaire

    Commentaire 3 commente le 2

    -"Premier commentaire"

    --"second commentaire"

    ---Troisième commentaire

    etc...

    Mon problème vient donc du fait que l'arbre ne monte pas plus haut qu'une branche.

    Fonction d'affichage :

    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
    	//affichage des commentaires
    	function display_comments (array $comments,$id_article,$boucle) 
    	{
    		if(empty($comments))
    		{
    			return '<p>
    			<img src="/php/images/commentaire/pinguin.png" ALIGN ="left" hspace="5" vspace="5" width="70" title="Aucun commentaire ?">
    			Il n\'y a pour le moment <b>aucun commentaire</b> sur cet article. Pour pallier ce manque, n\'hésitez pas à 
    			<a href="/php/articles/commentaire/rediger_commentaire.php?id_article='.$id_article.'" target="_self" title="Ajouter un commentaire ?">
    			ajouter un commentaire</a> !<br />
    			Il est par-contre nécessaire de se <b>connecter</b> via le menu en bas à gauche du site.<br />
    			Si vous n\'êtes pas encore inscrit , il est nécessaire de passer par <a href="/fsb2/index.php?p=register" target="_self" title=" S\'inscrire sur partir-en-vtt.com">le petit formulaire d\'inscription</a>
    			pour pourvoir intéragir. Cela prend une minute et est entièrement gratuit !<br /><br />
    			@bientôt,<br />
    			L\'équipe partir-en-vtt.
    			</p>';
    		}
    		foreach ($comments as $comment) 
    		{
    			$res .= '<div class="commentaire">';
    			$res .= '<div class="componentheading_categorie">'.stripslashes(htmlspecialchars($comment['commentaire_titre']));
    			$res .= '<span class="quote_droite">';
    			if($boucle == false) //commentaire cité, on ne met rien en modif ou quote
    			{
    				if(Fsb::$session->data['u_auth'] == 5) //admin : suppresion
    				{
    					$res .='<a href="/php/articles/commentaire/liste_commentaire.php?id_article='.$id_article.'&id_com_suppr='.$comment['id_commentaire'].'" target="_self" onclick="return confirm(\'Etes vous sur de vouloir supprimer ce commentaire ?\');"><img src="/php/images/commentaire/delete.gif" alt="Icône suppresion" title="Supprimer le commentaire"></a>';
    				}
     
    				if(Fsb::$session->data['u_id'] == $comment['u_id'] OR Fsb::$session->data['u_auth'] == 5) //c'est le message de l'utilisateur donc il peut modifier
    				{
    					$res .='<a href="/php/articles/commentaire/rediger_commentaire.php?id_article='.$id_article.'&id_com_up='.$comment['id_commentaire'].'" target="_self"><img src="/php/images/commentaire/edit.gif" alt="Icône édition" title="Modifier votre commentaire"></a>';
    				}
    				if(Fsb::$session->data['u_id'] != $comment['u_id']) //c'est n'est pas son message il peut donc le citer
    				{
    					$res .= '<a href="/php/articles/commentaire/rediger_commentaire.php?id_article='.$id_article.'&id_com_cite='.$comment['id_commentaire'].'" target="_self"><img src="/php/images/commentaire/quote.gif" alt="Icône citation" title="Citer le commentaire ?"></a>';
    				}
    			}
    			$res .= '</div></span>';
    			if(isset($comment['children']))
    			{
    				$res .= display_comments($comment['children'], $id_article,$boucle = true).'<br />';
    				$type_reponse = ' a répondu';
    			}
    			else
    			{
    				$type_reponse = ' a écrit';
    			}
    			$res .= '<i><b>'.ucfirst(utf8_decode($comment['u_nickname'])) . $type_reponse.'</i></b>';
    			$res .= '<p>' . $comment['commentaire_contenu'] . '</p>';
    			$res .= '</div>';
    		}
    		return $res;
    	}
    	//affichage
    	echo display_comments($tableau_commentaire,$id_article,$boucle=false);


    Les fonctions de génération de l'arbre :

    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
    <?php
     
    	/**
    	 * Get all comments attached to an article
    	 *
    	 * @param PDO $bdd                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 $bdd, $id, array $search_params = array(), array $options = array()) {
    		// Parameters validation
    		if ($bdd === 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 ca.id_commentaire,c.u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp,u_nickname, u_auth ".
    				 "FROM pevtt_commentaire AS c ".
    				 "JOIN pevtt_commentaire_article AS ca ON (ca.`id_commentaire`=c.`id_commentaire`) ".
    				 "JOIN fsb2_users d ON d.u_id = c.u_id";
     
    		// Where Clause Construction
    		$search_params['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 = $bdd->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($bdd, $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 $bdd              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 $bdd, $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");
     
    		$racine=$_SERVER['DOCUMENT_ROOT'];
    		include($racine . '/inclusion/connect_pdo_v3.php'); 
     
    		// Query Generation
    		$query = "SELECT id_commentaire,c.u_id,commentaire_titre,commentaire_contenu,commentaire_timestamp,u_nickname, u_auth ".
    				 "FROM pevtt_commentaire AS c ".
    				 "JOIN pevtt_commentaire_commente AS cc ON (cc.id_commented=c.id_commentaire) ".
    				 "JOIN fsb2_users d ON d.u_id = c.u_id ".
    				 "WHERE cc.id_commentant = :parent_id";
    		$stmt = $bdd->prepare($query);
     
    		// Query Execution
    		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;
    	}
     
    	$tableau_commentaire = get_article_comments($bdd,$id_article);
    Je remercie quiconque qui pourra m'aider à résoudre le souci.

  15. #35
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Vérifie que tes enregistrement forment bien un arbre. les fonctions que je t'ai passé permettent normalement de récupérer cet arbre en intégralité.

  16. #36
    Membre éclairé
    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
    Par défaut
    Bonjour,

    En effet cependant l'arbre ne se créer pas. Si on regarde la table "pevtt_commentaire_commente" qui permet de connaître les messages commentés et les commentant, on a :

    id_commentant_|id_commented
    108 | 106
    111 | 108


    Soit :

    • Le message 108 à commenté le message 106
    • Le message 111 à commenté le message 108


    En théorie, on devrait donc avoir pour le message commentant le message commenté quelque chose du genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <commenté>
     
    Message 108 
     
    <commenté>Message 106 </commenté>
     
    </commenté>
     
    message 111
    On peut voir que ce n'est malheureusement pas le cas sur :

    http://www.partir-en-vtt.com/php/art...id_article=220

    je ne sais pas où est le point empêchant la création de l'arbre au niveau n +2.

    Par avance merci Pour ton aide Benjamin.

  17. #37
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Je ne vois pas d'erreur dans mon code... Enfin sûrement qu'au runtime PHP ne l'entends pas de cette oreille. Qu'a cela ne tienne, faisons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    error_reporting(-1);
    ini_set('display_errors', 1);
    Pour voir les éventuels messages d'erreur.

    Qu'est ce que ça nous dis ?

  18. #38
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Uh oh! J'ai parlé trop vite, y'a effectivement un snag ligne #115 (http://www.developpez.net/forums/ano...5294ebea4ec595)

    On a oublié que le premier paramètre était une ressource PDO, or on a oublié de la passer... tu m'étonnes que ça marche pas.

    Bref, il faut remplacer l'appel par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $child['children'] = get_child_comments($bdd, $child['id_commentaire'], $depth-1);

  19. #39
    Membre éclairé
    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
    Par défaut
    Bonsoir,

    Impeccable, c'était ça et j'étais incapable de trouver


    Un grand merci

    Exemple d'un résultat : http://partir-en-vtt.com/php/article...id_article=166

    Résolu !

  20. #40
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    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
    Par défaut
    Super ! ça m'étonne que l'erreur n'ait pas fait partir le script en FATAL_ERROR...

    Enfin, bon courage pour la suite

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Tri array imbriqué
    Par chouchouilloux dans le forum Langage
    Réponses: 4
    Dernier message: 31/10/2012, 23h01
  2. [XL-2003] arrays imbriquées ?
    Par fb62840 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 02/05/2012, 15h20
  3. Réponses: 2
    Dernier message: 26/05/2011, 16h43
  4. [PHP 4] array imbriqué : afficher les numéros de ligne d'un menu arborescent
    Par PHPdudimanche dans le forum Langage
    Réponses: 1
    Dernier message: 12/01/2009, 14h28
  5. [cr 8.5] comment exploiter les données d'un "array"
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 09/06/2005, 14h03

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