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 :

Requête Récursive PHP et MYSQL pour les niveaux de catégories [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut Requête Récursive PHP et MYSQL pour les niveaux de catégories
    Bonjour.

    Quand je mets dans ma table le parent_id 0, ça va afficher la racine, c'est correcte; 1 pour le niveau 1, 2 pour le niveau 2, mais si j'ai plusieurs niveau 2 et que je mets un niveau supérieur, ça va pas se placer dans le bon niveau le sous-niveau.

    Regardez l'image la table à gauche le parent_id et le résultat à droite. Vous allez voir de quoi je parle.

    Je pensais que si je mettais 2 que ça allait se placer à un niveau 2 mais pas nécessairement à la bonne branche.

    Qu'est-ce qui ne va pas dans mon code pour ne pas se placer à la bonne place?

    Nom : requeterecursive.jpg
Affichages : 1285
Taille : 223,4 Ko

    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
    <?php
     
    include 'db.php';
     
    function getCategories($parent_id) {
        $sql = "SELECT * FROM category WHERE parent_id='$parent_id'";
        $db = getDB();
        $stmt = $db->query($sql);
        $res = $stmt->fetchAll(PDO::FETCH_OBJ);
        if($res!=NULL)
        {
            echo '<ul>';
            foreach($res as $row)
            {
                echo '<li>' . $row->parent_id .'-'. $row->name . '</li>';
                getCategories($row->id);
            }
            echo '</ul>';
        }
    }
    echo getCategories(0);
    ?>
    C'est pas évident d'indiquer le bon parent_id pour que ça aille dans le bon niveau et surtout à la bonne catégorie.

    J'ai besoin d'aide pour remanier mon code et apprécié. Ça fait un bon bout que je fais des lectures sur les requête
    récursives avec Mysql.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Bizarre, moi quand je compare les données de ta base et ton résultat, ça m'a l'air cohérent : Rose a bien deux enfants, Prisme et Sphère en ont un chacun
    Par contre, tu parles de "niveau". Il n'y a pas niveaux dans ton arbre, seulement des parents et des enfants. Le fait de mettre "2" dans le parent_id fait que l'élément est un enfant de l'élément qui a pour id "2", et ce quel que ce soit les parents de ton élément "2".

    Pour y voir plus clair, affiche l'id et le parent_id sur chaque ligne : echo '<li>' . $row->name .' (id : '.$row->id.', est un enfant de : '.$row->parent_id. ')</li>';
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    tu te mélanges allègrement les pinceaux : tu confonds "niveau" avec "id du parent".

    • "id_parent" n'est PAS le "niveau", mais bien l'"id" du parent.

  4. #4
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Oui, finalement, c'est cohérent et j'ai bien compris le principe.

    Un item ID10 qui aurait un PARENT_ID3, ça veut dire que le ID10 est enfant du ID3.

    Autrement dit, 10 est une sous-catégorie de 3.

    Je voyais le 3 comme un niveau plus profond.

    Lors de l'enregistrement, il faudra que je fasse un menu déroulant qui donne le choix
    du ID disponible comme parent pour placer la sous-catégorie dans le parent et ajouter
    un autre élément pour créer l'enregistrement du produit.

    Mais, le hic, il faut s'assurer que si on efface un Parent_id, c'est de s'assurer qu'il n y
    ait pas de ID enfant.

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Tu as deux possibilités pour gérer le cas :
    Soit il est impossible de supprimer un élément qui a des enfants, auquel cas il faut faire la vérification avant de supprimer le parent.
    Soit la suppression de l'élément supprime automatiquement tous les enfants, auquel cas il faut faire la suppression des enfants. Attention, dans ce cas, il faut gérer les enfants des enfants... ou utiliser une contrainte DELETE CASCADE
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Les lectures que je viens de faire, c'est toutes sur deux tables.

    Mais dans mon cas, DELETE CASCADE sur une seule table:

    Si je veux par exemple sur la table:

    id - parent_id - nom
    10 - 0 - voiture
    23 - 10 - voiture rouge

    Si je veux supprimer le ID 10 qui serait voiture, le DELETE CASCADE supprimerait aussi le ID 23
    et ses id enfants?

    D'après ce que j'ai compris, il faut ajouter une contrainte lors de la création de la table
    et ajouter des liens en PHP pour ça?

    Pour la contrainte, c'est à quel endroit dans la table?

    C'est une nouvelle notion pour moi.

  7. #7
    Invité
    Invité(e)
    Par défaut
    La première question à te poser : "Quelle DECISION vais-je prendre quant au fonctionnement ?"

    Comme l'a dit Celira : plusieurs solutions possibles.

    D'autres options sont possible :
    • conserver les sous-catégories, pour pouvoir les affecter plus tard à un autre parent
    • avoir une case à cocher : "Supprimer aussi les sous-catégories associées ?"
    • ....


    1/ Tu dois d'abord CHOISIR.

    2/ Ensuite DEFINIR la bonne méthode pour y parvenir.

    3/ seulement après commencer à CODER.

  8. #8
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je crois que la meilleur solution serait d'afficher les catégories sous forme d'arbre et cocher ce que je veux supprimer.

    cat1 [x]
    - cat11 []
    --cat111 []

    Si je coche cat1, ça supprime aussi cat11 et cat111. etc.

    Si je veux supprimer cat1, c'est que je veux aussi tout supprimer de cette catégorie. Je n'aurai pas des milliers de données à supprimer.

  9. #9
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut suite du message de Celira
    Sujet déjà traité qui n'a pas été solutionné :
    http://www.developpez.net/forums/d24...de-meme-table/

    Mais, peut-être qu'aujourd'hui, c'est possible?

    Ajouter ON DELETE CASCADE sur la même table.

    Les ID 5,6,7,8 qui a comme parent le ID 2

    Si je dois supprimer le ID 2, ça doit aussi supprimer le ID 5,6,7,8

    Si je supprime que le ID 5 mais qu'il n a pas de ID enfant, je supprime que le ID 5.

    En faite, c'est ça que je voudrais suite à la dernière intervention de Celira.

    Pas grand chose dans G.... pour trouver sur cela.

  10. #10
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Bonjour.

    J'ai pris un recul pour voir tout ça et aujourd'hui j'ai essayé dans la base de donnée via une requête SQL avec phpmyadmin et ensuite examiné le résultat et j'ai fini par comprendre un peu plus. J'ai pas testé en PHP mais, ça c'est à venir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE category (
        id INT PRIMARY KEY AUTO_INCREMENT,
        parent_id INT NULL,
        FOREIGN KEY (parent_id) REFERENCES category (id) ON DELETE CASCADE
    ) ENGINE=InnoDB
    Ça devrait permettre de supprimer une ligne avec leurs subordonnées.

    Joyeuses fêtes!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Utiliser PHP et MySQL pour un site à fort traffic
    Par lexayo dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 17/12/2007, 17h40
  2. [EasyPHP] Configurer Easy PHP 1.8 pour les codes php4
    Par Alexandrebox dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 41
    Dernier message: 20/02/2007, 15h15
  3. [PHP-JS] PHP et JavaScript pour les formulaires
    Par Ylias dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 26/07/2006, 22h47
  4. PHP et MYSQL pour création et modification
    Par guillaumeIOB dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 03/05/2006, 18h53

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