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 :

Catégories en cascade et suppression [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut Catégories en cascade et suppression
    Bonjour et bonnes fêtes

    Nouveau sur ce forum, je me retrouve actuellement confronté à un problème qui me fait tourner en bourrique...

    J'ai cette table (volontairement réduite au strict minimum)

    CREATE TABLE categories (
    id_cat bigint(20) NOT NULL auto_increment,
    lib_cat varchar(45) NOT NULL default '',
    parent_cat bigint(20) NOT NULL default '0'
    PRIMARY KEY (id_cat)
    ) TYPE=MyISAM;

    Cette structure me permet la création de catégories en cascade en utilisant le champ parent_id comme clé étrangère (id de la catégorie mère)

    catégorie 1
    -categorie 1.1
    --categorie 1.1.1
    --categorie 1.1.2
    ---categorie 1.1.2.1
    ---categorie 1.1.2.2
    ----categorie 1.1.2.2.1
    --categorie 1.1.3
    ---categorie 1.1.3.1
    -categorie 1.2
    -categorie 1.3
    categorie 2
    etc..........

    Mon souci se situe au niveau de la suppression d'une catégorie et tous ses enfants.

    Si je souhaite supprimer la catégorie 1.1, je pourrai facilement supprimer les 1.1.1, 1.1.2 et 1.1.3, mais je planche complètement pour la suppression des 1.1.2.1, 1.1.2.2, 1.1.2.2.1 et 1.1.3.1 (les descendants indirects).

    Ca fait plus d'une heure que je suis dessus, sans arriver à trouver le script correct qui me permettrait de supprimer proprement une catégorie et tous ses descendants, à l'aide de requêtes et de boucles en cascades. Sachant bien entendu qu'il serait possible d'avoir 50 générations dans une catégorie...

    À l'aide de ce bout de code, je peux supprimer la génération descendante directe (j'ai plusieurs autres traitements dans le while, utilisant l'ID renvoyé), mais pas toutes les autres qu'il peut y avoir après...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $rq1 = mysql_query("SELECT id_cat
    				FROM categories
    				WHERE parent_cat = $catcour");
    while($res1 = mysql_fetch_array($rq1)) {
    	mysql_query("DELETE FROM categories
    				WHERE id_cat = $res1[0]");
    	}
    Si vous avez de quoi éclairer ma lanterne, ça serait formidable

    Merci d'avance à tous !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Par défaut
    tu aimes le récursif?

    j'ai peut être l'idée mais je te laisse la technique (il est tard je dois y aller et je n'ai jamais tenté le reccursif en php il y a peut etre une définition spéciale dans la fonction à faire...)
    tu sais récupérer les id de la catégorie enfants.
    à partir de ça tu sais tout faire

    tu fais une tite fonction
    dans l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    fonction effacer_enfants(id_categorie)
    {
    si enfants=0 alors effacer la catégorie dont l id est id_categorie
    si enfants>0 
    alors 
    récupérer les id de la catégorie enfant
    et pour chaque faire effacer_enfants(id_categorie_enfant) 
    puis  effacer_enfants(id_categorie) 
    (ou tout simplement effacer la catégorie dont l id est id_categorie si le code n est pas bon ça évitera de trop boucler ;) )
    }
    au niveau algorithme je pense que c'est une piste
    il manque p-e un truc dans mon raisonnement

    en gros si y'a pas d'enfants tu effaces
    si y'a des enfants tu essayes de les effacer avant d'effacer la catégorie
    et vu que c'est récursif....

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    ah oui c'est pas bête ça tiens

    Je vais explorer cette piste (j'y travaillais encore ), si j'ai quelque chose je mettrai la source ici, ça pourra en aider certains qui se cassent la tête comme moi

    Merci

  4. #4
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    Et pourquoi ne pas faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE * from matable where id_cat = '$adetruire' or parent_cat LIKE '$adetruire'%
    Ou alors j'ai loupé un épisode

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Citation Envoyé par guidav Voir le message
    Et pourquoi ne pas faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE * from matable where id_cat = '$adetruire' or parent_cat LIKE '$adetruire'%
    Ou alors j'ai loupé un épisode
    Salut,

    Tu as loupé un épisode

    J'ai une arborescence infinie, c'est à dire que je dois pouvoir supprimer peut-être 50 générations de sous-catégories, incluant la catégorie mère

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2002
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 194
    Par défaut
    Citation Envoyé par guidav Voir le message
    Et pourquoi ne pas faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE * from matable where id_cat = '$adetruire' or parent_cat LIKE '$adetruire'%
    Ou alors j'ai loupé un épisode
    parce que tu peux vouloir effacer un fils ou un parent et ses fils (ton code)
    ou un grand-parent et ses fils et ses petits-fils
    ou un arrière-grand-parent et ses fils et ses petits-fils et ses arrières-petits-fils
    ou un arrière-arrière-grand-parent...
    etc...
    vu qu'on ne connait pas le nombre et que le lien ne se fait que de père en fils... ça sent le récursif


    edit : oops doublon désolé

    p.s.: moi je suis intéressé de voir si ça donne qqch de particulier une fonction récursive en php

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    C'est re-moi

    Je suis parti sur ton algo, Léortien, et j'en ai pondu ça :

    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
    function delete_childs($id) {
    	echo '-'; //essai pour vérifier la génération
    	$rq1 = mysql_query("SELECT count(*)
    						FROM categoriestest
    						WHERE parent_cat = $id");
    	$res1 = mysql_fetch_array($rq1);
    	if($res1[0] == 0) {
    		mysql_query("DELETE FROM categoriestest WHERE id_cat = $id");
    		echo $id.'<br>'; // essai pour renvoyer la catégorie supprimée
    		}
    	else {
    		$rq2 = mysql_query("SELECT id_cat
    						FROM categoriestest
    						WHERE parent_cat = $id");
    		while($res2 = mysql_fetch_array($rq2)) {
    			delete_childs($res2[0]);
    			}
    		}
    	}
    Ca fonctionne UNIQUEMENT pour les catégories en bout d'arborescence (donc sans enfants). Celles qui ont des enfants ne sont pas supprimées (par contre, si j'actualise, ça les vire bien)

    Je sens qu'on s'en approche, je continue à taffer dessus, si vous avez des conseils, n'hésitez-pas

    Merci !!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    C'était tout con

    Comme dirait Homer, youhou

    Voici donc le code tel qu'il le 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
    function delete_childs($id) {
    	echo '-';
    	$rq1 = mysql_query("SELECT count(*)
    						FROM categoriestest
    						WHERE parent_cat = $id");
    	$res1 = mysql_fetch_array($rq1);
    	if($res1[0] == 0) {
    		mysql_query("DELETE FROM categoriestest WHERE id_cat = $id");
    		echo $id.'<br>';
    		}
    	else {
    		$rq2 = mysql_query("SELECT id_cat
    						FROM categoriestest
    						WHERE parent_cat = $id");
    		while($res2 = mysql_fetch_array($rq2)) {
    			delete_childs($res2[0]);
    			}
    		mysql_query("DELETE FROM categoriestest WHERE id_cat = $id");
    		echo $id.'<br>';
    		}
    	}
    Merci de ton aide, Léortien, tu m'as fait économiser pas mal de temps

  9. #9
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    OK, je vois quel épisode j'avais loupé, j'avais pris les identifiants comme étant de la forme 1.2.3.4.
    Oui, dans ce cas je ne vois que le récursif, bien vu et compact d'ailleurs.

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

Discussions similaires

  1. suppression en cascade dans formulaire et sous-formulaire
    Par tooneygirl dans le forum Access
    Réponses: 7
    Dernier message: 20/06/2005, 14h17
  2. Requetes de suppression en cascade
    Par log2n dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 20/05/2005, 10h07
  3. Suppression en cascade
    Par log2n dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/05/2005, 20h33
  4. [debutant]suppression en cascade
    Par christophebmx dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 03/05/2005, 09h51
  5. Suppression de tables en cascade
    Par Moah dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/07/2004, 15h36

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