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 :

Arborescence


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut Arborescence
    Bonjour,

    Voila plusieurs jours que je m'efforce à faire une arborescence en MYsql php sans trouver la bonne requette SELECT à taper :

    ci dessous le schéma se base :



    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
    CREATE TABLE IF NOT EXISTS `rubrique` (
      `ID_RUBRIQUE` bigint(4) NOT NULL AUTO_INCREMENT,
      `INTITULE` varchar(255) NOT NULL,
      `DESCRIPTION` text,
      `KEYWORD` varchar(255) DEFAULT NULL,
      `URL` varchar(255) NOT NULL,
      `ETAT` int(11) NOT NULL,
      PRIMARY KEY (`ID_RUBRIQUE`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=21 ;
     
    CREATE TABLE IF NOT EXISTS `contien` (
      `ID_RUBRIQUE` bigint(4) NOT NULL,
      `ID_RUBRIQUE_1` bigint(4) NOT NULL,
      `NIVEAUX` int(11) NOT NULL,
      `PLACE` int(11) DEFAULT NULL
      PRIMARY KEY (`ID_RUBRIQUE`,`ID_RUBRIQUE_1`),
      KEY `I_FK_CONTIEN_RUBRIQUE` (`ID_RUBRIQUE`),
      KEY `I_FK_CONTIEN_RUBRIQUE1` (`ID_RUBRIQUE_1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;


    et donc voila ce que jessaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT rubrique.ID_RUBRIQUE,contien.ID_RUBRIQUE_1, INTITULE, contien.PLACE,contien.NIVEAUX, ETAT
    FROM rubrique, contien
    WHERE rubrique.ID_RUBRIQUE = contien.ID_RUBRIQUE
    AND rubrique.ETAT >=1
    ORDER BY contien.ID_RUBRIQUE_1,contien.NIVEAUX ASC


    Cette requette fonctionne pour les rubrique de niveaux 1 et 2 si j'ai une rubrique de niveau 3 ben elle ne se positionne pas au dessous de ca categorie parente.

    donc c pas bon.
    Si quelqu'un a une idée meme s'il faut faire le traitement en php je suis preneur

    Merci de votre compréhension

    Cordialment

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,

    par défaut mysql ne gère pas les requêtes récursives, depuis la version 5 de MySQL, tu peux créer une procédure stockée récursive qui te permettra de parcourir tes rubriques quelque-soit leur niveau dans l'arborscence.

    SI tu connais le nombre maximal de niveaux possible, tu peux tout simplement imbriquer des requêtes SELECT les unes dans les autres (autant de fois que de niveaux).

    Plus simplement tu peux faire une fonction PHP récursive.

    J'avais développé un exemple il y a quelques temps sur ce sujet :
    http://www.developpez.net/forums/d66...ir-tables-sql/

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut Je comprend
    J'ai regardé le topic que tu ma dit et je comprend pas grand chose enfet ce que moi je voudrait fairre c'est afficher ces rubue dans uneeeeeeebleau hml exemple
    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
     
    <table>
    <tr><td>Accueik</td></tr>
    <tr><td>Rubrique 1</td><tr>
    <tr><td>-soubrubirque 1</td><tr>
    <tr><td>--sousoubrubirque 1</td><tr>
    <tr><td>Rubrique 2</td><tr>
    <tr><td>-soubrubirque 2</td><tr>
    <tr><td>--sousoubrubirque 2</td><tr>
    <tr><td>Rubrique 3</td><tr>
    <tr><td>-sousrubrique3</td><tr>
    <tr><td>-sousrubrique3</td><tr>
    <tr><td>Rubrique 4</td><tr>
    <tr><td>Rubrique 5</td><tr>
    </table>
    donc je reprend la fonction utlisé en aldaptant à ma table :

    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
     
    function listPages($currentPageRow){
    	include("../../connect/connect.php");
        if(!is_null($currentPageRow)){
            $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND 
    contien.ID_RUBRIQUE_1=:parent';
    $resquery=$conn->prepare($query);
    $resquery->bindParam('parent',$currentPageRow['ID']);
        }
        else{
            $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE';
    $resquery=$conn->prepare($query);
     
        }
    $resquery->execute();
    $row=2;
        if(count($row) > 0){
            echo '<tr>';
            while($page=$resquery->fetch(PDO::FETCH_BOTH)){
                echo '<td>'.$page['INTITULE'].'</td>',
                listPages($page);
            }
            echo '</tr>';
        }
    }
    listPages(null);
    Svp aidez moi je galere pour ces histoire d'aborescence je crois qu'un bon tutoriel s'impose.

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,

    Déjà tu fait une inclusion de ton fichier de connexion à chaque appel de la fonction listPage, étant donné qu'elle est récursive ca va inclure ton fichier autant de fois qu'il y a de rubriques dans ta base.

    il faut inclure ton fichier de connexion en dehors de la fonction.

    Ensuite je ne pense pas que cette requête te renvoie les éléments de premier niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE
    Les rubriques ancêtres ont un ID_RUBRIQUE à NULL, ou à 0 ou autre ?

    Sinon qu'est ce qui ne fonctionne pas avec ce code ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut souci de répétition
    ou alors en mettant

    global $conn;

    dans la fonction c'est vrai

    ca marche mintenant.

    Mais mon probleme de départ est toujours la je croyé ke c'était à cause de mon fichier connet mais non : je m'explique

    Je sais pas si vous avez compris ma fonction mais elle a pour but d'ordonner les catégories et sous catégories ais de suie:

    Par exemple

    Rubrique
    sousRubrique
    sousousRubrique1

    Le souci c'est que une fois que les rubriques sont ordonner on dirai qu'il reboucle et répète d'autre rubiruqe qui on déja été répété
    Si quelqun à une piste aider moi merci d'avance

  6. #6
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,
    merci de ne pas me laisser de messages visiteurs lorsque vous souhaitez de l'aide, répondez simplement sur votre sujet et je verrais automatiquement que vous avez répondu

    Le problème est évident, voici les lignes qui posent problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $row=2;
        if(count($row) > 0){
    Etant donné que count($row) est toujours > à 0, forcement ca rappelle la fonction et ca boucle à l'infini.

    Je pense que tu dois utiliser rowCount :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $numrows = $resquery->rowCount();
         if($numRows > 0){

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut Hélas cela ne marche
    Dsl pour le message en privé je ne le ferait plus

    Maisj'ai toujours le meme bug ca me répète des ligne à la fin qui devrait pas être répété
    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
     
    require("../../connect/connect.php");
    	function listPages($currentPageRow){
    	global $conn;
        if(!is_null($currentPageRow)){
            $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND 
    contien.ID_RUBRIQUE_1=:parent AND ETAT>=1';
    $resquery=$conn->prepare($query);
    $resquery->bindParam('parent',$currentPageRow);
        }
        else{
            $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND ETAT>=1';
    		$resquery=$conn->prepare($query);
     
        }
    $resquery->execute();
    $row=$resquery->rowCount();
     
        if($row > 0){
            while($prub=$resquery->fetch(PDO::FETCH_BOTH)){
     
    			 echo '<tr><td>'.$prub['ID_RUBRIQUE'].'</td>';
     
    	 echo '</tr>';
     
          listPages($prub['ID_RUBRIQUE']);
     
            }
     
        }
    }
    listPages(Null);

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut Par exemple
    Pour l'instant jai juste 2 insertion dans ma table

    une insertion avec un id de "2" qui n'a pas de rubirque mere
    et une une insertion avec un id de " 6 " qui à pour rubrique mere 2


    Et ca ma sort avec la fonction :

    2
    6
    6---> pourquoi ce 6 se répète et pourtant dans mabase donnée il n'y a pas de doublons

  9. #9
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,

    Dans un de mes message précédents je t'indiquais déjà que tu faisais une erreur pour lister les pages parents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND ETAT>=1';
    Renvoie l'ensemble des rubrique dont l'état est supérieur à 1.

    Je te repose donc ma question :

    Les rubriques ancêtres ont un ID_RUBRIQUE à NULL, ou à 0 ou autre ?

  10. #10
    Membre très actif Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Par défaut
    Essai de passer l'attribut PDO::MYSQL_ATTR_USE_BUFFERED_QUERY lorsque tu instancies ton objet pdo
    Tu ne peux pas faire plusieurs queries imbriquées si par ailleurs tu ne fais pas de fetchAll ou closeCursor

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut rubrique à 0
    rubrique à idencetre à 0


    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY et c koi ca ou ca closeCursor
    Je connais pas

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut C bon ca marche
    effectivement c'était un erreur dans ma requette

    pour les les parent sans parent

    donc voila ce que j'ai mis :
    SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND ETAT>=1 AND contien.ID_RUBRIQUE_1=0

    Merci beaucoup en tous cas

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 20
    Par défaut Réouverture de ce topic
    Bonjour je ré ouvre aujourd'hui ce topic car je suis confronté à un petit problème.
    La fonction de ThomasR m'a bien était utile quand je programmé en procédural mais la je me suis mis à l'objet et je suis un peu coincé avec cette fonction je rappelle donc cette fonction :

    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
    require("../../connect/connect.php");
    	function listPages($currentPageRow){
    	global $conn;
        if(!is_null($currentPageRow)){
            $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND 
    contien.ID_RUBRIQUE_1=:parent AND ETAT>=1';
    $resquery=$conn->prepare($query);
    $resquery->bindParam('parent',$currentPageRow);
        }
        else{
            $query = 'SELECT * FROM rubrique,contien WHERE rubrique.ID_RUBRIQUE=contien.ID_RUBRIQUE AND ETAT>=1';
    		$resquery=$conn->prepare($query);
     
        }
    $resquery->execute();
    $row=$resquery->rowCount();
     
        if($row > 0){
            while($prub=$resquery->fetch(PDO::FETCH_BOTH)){
     
    			 echo '<tr><td>'.$prub['ID_RUBRIQUE'].'</td>';
     
    	 echo '</tr>';
     
          listPages($prub['ID_RUBRIQUE']);
     
            }
     
        }
    }
    listPages(Null);
    donc enfet ce que j'ai fait j'ai crée une classe et j'ai mis cette méthode dedans mais le truc c'est que j'aimerais que cette fonction me retoune toutes les valeurs hirachisé correctement mais sans balise de mise en forme pour que ensuite je puisse les traiter.

    Par exemple pouvoir récupérer toutes les valeur en fesant appel à une seule fonction pour pouvoir les afficher sur une page avec un un format tableau et sur une autre page sous forme de liste <ul> et sur une autre pages de liste déroulante.

    Donc voila je voudrait faire en sorte d'appeller la méthode comme cela :
    $mesrub=$rubrique->listPages(Null);

    et de traiter le tableau retourner par un foreach ou autre chose peut être

    si quelqu'un peut m'aider je le remercie d'avance*

    Cordialement Guillaume Escande

Discussions similaires

  1. Recuperation Arborescence
    Par ramseb dans le forum HyperFileSQL
    Réponses: 6
    Dernier message: 16/06/2003, 09h52
  2. controle d'arborescence
    Par billyboy dans le forum Windows
    Réponses: 4
    Dernier message: 13/06/2003, 21h19
  3. [VB6] parcourir une arborescence de repertoire
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 17h33
  4. créer une arborescence windows sous forme d'arbre java
    Par chupachoc dans le forum Composants
    Réponses: 3
    Dernier message: 01/10/2002, 16h48
  5. arbre de parcour d'arborescence windows
    Par chupachoc dans le forum Composants
    Réponses: 7
    Dernier message: 09/09/2002, 08h09

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