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

Langage PHP Discussion :

[Tableaux] Problème de suppression de messages sur mon forum


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut [Tableaux] Problème de suppression de messages sur mon forum
    Bonjour,
    j'ai un petit forum avec 2 tables, l'une pour les sujets, le titre et l'auteur qui se nomme "header" et l'autre pour le contenu qui se nomme "body".
    Elles sont reliées par la clés "postid" qui est Primaire sur "header" .

    Dans ma table "header" j'ai une colonne "parent" qui indique si ce sujet a un parent: elle a pour valeur le "postid" du message auquel elle repond ou "0" si c'est le 1er sujet.
    J'ai une colonne "children" qui indique si ce message a des enfants en reponse.

    Mon probleme est pour la suppression des messages, si je supprime une reponse je voudrais que tous ses descendants soient supprimés, si c'est le 1 er message je voudrai que tous ses descendants soient supprimés.
    Pour le moment je n'arrive a supprimer que un par un...

    Le "postid" est transmis dans l'URL. Voici comment je commence :
    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
    $postid = $_GET['postid'];
     
     if(!$postid) return false;
     
      $conn = db_connect();
     $query1 = "select from header where postid = $postid";
        $result1 = mysql_query($query1, $conn);
     $nombre_de_resultats = mysql_num_rows($result1);
     $ligne = mysql_fetch_array($result1); 
     
     parents = $ligne['parent'];
     children = $ligne['children'];
     
     if (!$result1)
         return false;
    Ensuite pour le traitement je bloque avec toutes les conditions par rapport aux valeurs de "parent" et de "children".
    Je sais pas si c'est bien clair mais merci à ceux qui pourront m'aider !

  2. #2
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    personne ne voit ?

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il te manque quelque chose dans ton select

    Sinon ben tu as tout pigé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    (pseudo code)
    function supprimer($id) {
       $children := "select children from ma_table where postid = $id"
       if ($children != 0) {
          supprimer($children);
       }
       delete from children where postid = $id
    }
     
    supprimer($_GET['postid']);
    Grosso merdo c'est comme ça que j'aurais fait...

  4. #4
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    bien le bonjour,

    si j'ai bien compris, chacun des messages connait son parent (s'il y en a un) et son fils (s'il y en a un).
    donc, a partir du postid, il faudrait boucler sur tous ses fils de la maniere suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    si le header numero post_id a un pere, 
         recuperer l'id du pere
         dire au pere qu'il n'a plus de fils
    FinSi
     
    header_courant = post_id
    Tant que header_courant a un fils,
         recuperer l'id de ce fils.
         supprimer le body correspondant au header courant.
         supprimer le header_courant. 
         header_courant = id du fils
    Fin Tant que
    tout ca me fait beaucoup penser a de la gestion de liste chainee (meme doublement chainee puisque chaque header connait son pere et son fils).

    on aurait pu discuter (et troller ) pendant des semaines sur la maniere de gerer les tables. Elles sont deja fixees et c'est pas plus mal.

  5. #5
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Citation Envoyé par khayyam90
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    si le header numero post_id a un pere, 
         recuperer l'id du pere
         dire au pere qu'il n'a plus de fils
    FinSi
     
    header_courant = post_id
    Tant que header_courant a un fils,
         recuperer l'id de ce fils.
         supprimer le body correspondant au header courant.
         supprimer le header_courant. 
         header_courant = id du fils
    Fin Tant que
    +1, j'ai oublié de dire au pere qu'il a perdu son fils, le pauvre.
    +1, en iteratif c'est plus performant qu'en récursif
    -1, si il y a des contraintes d'integrité sur la base alors on ne peut supprimer le header courant car le fils référencerait alors un pere qui n'existe pas.

  6. #6
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    oui c'est exactement ca que je cherche vous avez compris l'affaire.
    Le probleme est qu'avec toutes ces conditions je suis un peu perdu dans mes requetes !

  7. #7
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    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
     
    function supprimer($id) {
       $sql = "select children from header where postid = $id";
       $res = mysql_query($sql);
       $row = mysql_fetch_assoc($req);
       $children = $row['children'];
       if ($children != 0) {
          supprimer($children);
       }
       $sql = "delete from header where postid = $id";
       mysql_query($sql);
    } 
     
    $id = $_GET['postid'];
     
    //On dit au parent qu'il vient de perdre son fils
    $sql = "select parent from header where postid = $id";
    $res = mysql_query($sql);
    $row = mysql_fetch_assoc($req);
    $parent = $row['parent'];
    $sql = "update header set children = 0 where postid = $parent";
    mysql_query($sql);
     
    //On supprime le header et sa descendance
    supprimer($id);
    Je te laisse optimiser et faire les contrôle d'erreurs

  8. #8
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    merci je vais etudier cela cet eprem et je vous tiens au courant.

  9. #9
    Rédacteur

    Avatar de khayyam90
    Homme Profil pro
    Architecte de système d’information
    Inscrit en
    Janvier 2004
    Messages
    10 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Architecte de système d’information

    Informations forums :
    Inscription : Janvier 2004
    Messages : 10 369
    Points : 40 164
    Points
    40 164
    Par défaut
    dans le meme genre de remarque,

    si il y a des contraintes d'integrité sur la base alors on ne peut supprimer $children car le pere référencerait alors un fils qui n'existe pas, c'est juste prendre le probleme dans l'autre sens.

    il suffit donc de rajouter la suppression des liens de parente avant de supprimer les elements eux-memes. Evidemment ca n'est pas necessaire s'il n'y a pas de contraintes d'integrite a ce niveau.

  10. #10
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    vi c'est assez prise de tête finalement. Et si on changeait le schéma des tables ?

  11. #11
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    c'est pas encore tout a fait ca, je m'explique :
    Si il y a 1 parent et 2 children, si je supprime le 1er children cela devrait me supprimer son descendant, or cela ne me le supprime pas. Je me retrouve avec des descendant dont le "parent" vaut le "postid" du 1er enfant qui vient d'etre supprimé.
    Je sais pas si c'est bien clair ?!

  12. #12
    Membre averti Avatar de guy2004
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    805
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 805
    Points : 377
    Points
    377
    Par défaut
    Voici où j'en suis : j'arrive a supprimer uniquement le 1 er enfant des messages !
    Si un message parent comporte 4 reponses, si je supprime le message parent cela me supprime le parent et le 1 er enfant, ce qui m'en laisse encore 2 dans ma base !
    Voici mon code actuel :
    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
     
    function supprimer($id) { $conn = db_connect();
       $sql = "select children from header where postid = $id"; 
       $res = mysql_query($sql, $conn); 
       $row = mysql_fetch_assoc($res); 
       $children = $row['children']; 
       if ($children != 0) { 
       $sql = "delete from header where parent = $id"; 
          supprimer($children); 
    	  mysql_query($sql, $conn); 
       } 
       $sql = "delete from header where postid = $id"; 
       mysql_query($sql, $conn); 
    };
     
    $id = $_GET['postid']; 
    $conn = db_connect();
    //On dit au parent qu'il vient de perdre son fils 
    $sql = "select parent from header where postid = $id"; 
    $res = mysql_query($sql, $conn); 
    $row = mysql_fetch_assoc($res); 
    $parent = $row['parent']; 
    $sql = "update header set children = 0 where postid = $parent"; 
    mysql_query($sql); 
     
    //On supprime le header et sa descendance 
    supprimer($id);
    c'est surement une histoire de boucle mais comment faire ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/03/2007, 15h04
  2. compteur de messages sur mon serveur imap
    Par Olivier Regnier dans le forum Ruby
    Réponses: 10
    Dernier message: 07/03/2007, 17h45
  3. [Tableaux] Problème d'ajout d'images sur une page
    Par linkman dans le forum Langage
    Réponses: 2
    Dernier message: 29/07/2006, 21h29
  4. Réponses: 3
    Dernier message: 26/04/2006, 21h45
  5. Réponses: 6
    Dernier message: 29/10/2005, 14h10

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