Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1196 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Imbrication de méthodes dans une class

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Imbrication de méthodes dans une class

n°1559008
Big-Foot
Posté le 11-05-2007 à 16:19:00  profilanswer
 

Hello,
 
En ce moment j'ai un petit problème d'objet que je n'arrive pas à résoudre, pourtant c'est pas très compliqué. Je m'explique:
J'ai une class SiteMap qui permet de gérer un plan de site web.
Je fais une méthode DeletePage() qui doit effacer une page de la table MySQL ainsi que toutes les pages filles, je fais donc un appel à DeletePage() au seins de DeletePage() mais ça fonctionne pas vraiment comme je voudrait; cet appel détruit les paramètres de DeletePage() mère et les pages parallèles ne sont plus effacées.
 
Un petit shéma pour voir ce qui se passe:
 


INDEX (page que j'efface)
                  |
                  |- VELO (ok - effacée)
                  |        |
                  |        |- PROUT (ok - effacée)
                  |
                  |- VOITURE ( pas effacée snif)


 
Et voilà le code:
 

Code :
  1. function DeletePage($page_id)
  2. {
  3.  $sql0 = mysqli_query($this->link, "DELETE FROM `sitemap` WHERE `id`='$page_id'" );
  4.  $sql1 = mysqli_query($this->link, "SELECT `id` FROM `sq_dzsitemap` WHERE `parent_id` = '$page_id'" );
  5.  if(mysqli_affected_rows($this->link) !=0)
  6.  {
  7.   $id = mysqli_fetch_row($sql1);
  8.   $this->DeletePage($id[0]);              // ICI
  9.  }
  10.  else
  11.  {
  12.   $this->warning_DeletePage = 'Page et pages filles supprimées avec succès';
  13.  }
  14. }


 
Si je comprend bien, ce qui se passe en gros c'est ca:
- la méthode efface la page que qu'on lui demande
- elle selectionne les pages filles
- à la première page fille à effacer elle s'auto-appelle, et à ce moment là elle perd la mémoire de sa selection et donc n'efface jamais les pages du même niveau.
 
J'ai regardé un peu du côté de clone, ::parent, mais je trouve pas vraiment ce que je veux, ou ce que je crois vouloir :)


Message édité par Big-Foot le 11-05-2007 à 16:20:02
mood
Publicité
Posté le 11-05-2007 à 16:19:00  profilanswer
 

n°1559015
skeye
Posté le 11-05-2007 à 16:24:41  profilanswer
 

Tu comprends mal. Ton code ne supprime que la première fille récupérée via ta requête, quoi qu'il arrive. C'est ton algo qui est à revoir.


Message édité par skeye le 11-05-2007 à 16:25:17

---------------
Can't buy what I want because it's free -
n°1559020
omega2
Posté le 11-05-2007 à 16:28:40  profilanswer
 

Question : Pourquoi ne traites tu que la premiére ligne retourné par la requette? C'est pas étonant si les éléments des autres lignes ne sont ensuite pas suprimé.
 
Petite remarque en passant : Commence par supprimer les éléments fille et une fois que c'est fait supprime l'élément pére. Si jamais ton script ne termine pas son boulot (par exemple à cause du timeout réglé par défaut à 30 ) tu pourras relancer le traitement vu que le pére n'aura pas été détruit.
 
A savoir : dans une base de donnée, quand un élément X nécessite l'existance d'un élément Y alors il faut toujours créer l'élément Y en premier et toujours détruire l'élément X avant l'élément Y.
D'ailleurs avec certaines bases de données, on peut indiqué à la base la liste des dépendances ce qui fait qu'elle est capable de faire le ménage d'elle même ou, en fonction de ces réglages, de refuser la destruction d'éléments qui ont des enfants.

n°1559021
Big-Foot
Posté le 11-05-2007 à 16:28:53  profilanswer
 

Oups c'est vrai ça j'avais même pas vu, c'est minable je me sens honteux  :sweat:
Je corrige ça tout de suite, j'imagine que il n'y aura pas de problème avec les méthodes imbriquées en fait.


Message édité par Big-Foot le 11-05-2007 à 16:29:59
n°1559023
skeye
Posté le 11-05-2007 à 16:30:06  profilanswer
 

Non, la récursion n'a rien à voir avec ton soucis.


Message édité par skeye le 11-05-2007 à 16:30:19

---------------
Can't buy what I want because it's free -
n°1559026
Big-Foot
Posté le 11-05-2007 à 16:34:39  profilanswer
 

J'ai l'impression que si, vu que je ne supprime que les pages avec $page_id alors que $page_id devrait en fait être un array pour contenir tous les id trouvés.

n°1559031
skeye
Posté le 11-05-2007 à 16:39:55  profilanswer
 

raté, essaye encore.


---------------
Can't buy what I want because it's free -
n°1559046
Big-Foot
Posté le 11-05-2007 à 16:57:19  profilanswer
 

Je mettrais bien le toute dans un for($i=0; $i<=count($page_id); $i++) sachant que $page_id est un array, mais j'ai testé et c'est pas encore ça on dirait.

n°1559065
skeye
Posté le 11-05-2007 à 17:14:16  profilanswer
 

page_id n'est pas un array.


---------------
Can't buy what I want because it's free -
n°1559096
Big-Foot
Posté le 11-05-2007 à 18:12:32  profilanswer
 

Je vois mais je dis que j'aurai dû en faire un array vu qu'il peut y avoir plusieurs page_id à effacer dans une demande.
Ca donnerait ça, mais c'est pas bon encore:

 
Code :
  1. function DeletePage($page_id)
  2. {
  3.  for($i=0; $i<=count($page_id); $i++)
  4.  {
  5.   $sql0 = mysqli_query($this->link, "DELETE FROM `sitemap` WHERE `id`='$page_id[$i]'" );
  6.   $sql1 = mysqli_query($this->link, "SELECT `id` FROM `sitemap` WHERE `parent_id` = '$page_id[$i]'" );
  7.   if(mysqli_affected_rows($this->link) !=0)
  8.   {
  9.    $j = 0;
  10.    while($row = mysqli_fetch_row($sql1))
  11.    {
  12.     $page_id2[$j] = $row[0];
  13.     $j++;
  14.    }
  15.    $this->DeletePage($page_id2);
  16.   }
  17.   else
  18.   {
  19.    $this->warning_DeletePage = 'Page et pages filles supprimées avec succès';
  20.   }
  21.  }
  22. }


Message édité par Big-Foot le 11-05-2007 à 18:20:44
mood
Publicité
Posté le 11-05-2007 à 18:12:32  profilanswer
 

n°1559100
skeye
Posté le 11-05-2007 à 18:16:09  profilanswer
 

m'enfin pourquoi tu fais pas un deletepage directement sur chaque page dans ton while?[:pingouino]


Message édité par skeye le 11-05-2007 à 18:16:21

---------------
Can't buy what I want because it's free -
n°1559103
Big-Foot
Posté le 11-05-2007 à 18:21:31  profilanswer
 

Ben parce que chaque page peut avoir des pages "filles" etc..

n°1559109
skeye
Posté le 11-05-2007 à 18:28:45  profilanswer
 

...un peu long à la détente, hein?

 


Code :
  1. function DeletePage($page_id)
  2. {
  3.  for($i=0; $i<=count($page_id); $i++)
  4.  {
  5.   $sql0 = mysqli_query($this->link, "DELETE FROM `sitemap` WHERE `id`='$page_id[$i]'" );
  6.   $sql1 = mysqli_query($this->link, "SELECT `id` FROM `sitemap` WHERE `parent_id` = '$page_id[$i]'" );
  7.   if(mysqli_affected_rows($this->link) !=0)
  8.   {
  9.    while($row = mysqli_fetch_row($sql1))
  10.    {
  11.      $this->DeletePage($row[0]);
  12.    }
  13.   }
  14.   else
  15.   {
  16.    $this->warning_DeletePage = 'Page et pages filles supprimées avec succès';
  17.   }
  18.  }
  19. }


Message édité par skeye le 11-05-2007 à 18:29:00

---------------
Can't buy what I want because it's free -
n°1559115
Big-Foot
Posté le 11-05-2007 à 18:37:28  profilanswer
 

J'avais pas compris ce que tu voulais dire.
Donc maintenant on a plus besoin du for principal et $page_id n'a plus besoin d'être une array vu qu'on envoie à chaque fois qu'un seul $page_id.
 

Code :
  1. function DeletePage($page_id)
  2. {
  3.   $sql0 = mysqli_query($this->link, "DELETE FROM `sitemap` WHERE `id`='$page_id'" );
  4.   $sql1 = mysqli_query($this->link, "SELECT `id` FROM `sitemap` WHERE `parent_id` = '$page_id'" );
  5.   if(mysqli_affected_rows($this->link) !=0)
  6.   {
  7.    while($row = mysqli_fetch_row($sql1))
  8.    {
  9.      $this->DeletePage($row[0]);
  10.    }
  11.   }
  12.   else
  13.   {
  14.    $this->warning_DeletePage = 'Page et pages filles supprimées avec succès';
  15.   }
  16. }


n°1559117
skeye
Posté le 11-05-2007 à 18:43:44  profilanswer
 

oui, voila...j'ai fait mon copier/coller un peu vite...


---------------
Can't buy what I want because it's free -
n°1559120
Big-Foot
Posté le 11-05-2007 à 18:54:59  profilanswer
 

En tout cas merci, ça m'a l'air de fonctionnner. J'avais un peu vite mis la faute sur la class parce que je n'était pas du tout certain qu'on pouvait imbriquer comme ça les méthodes.
D'ailleurs lorsque on fait l'appel  $this->DeletePage($row[0]);  c'est comme si on appellait un espèce de clone de DeletePage ? Enfin il peut pas y avoir d'intérférences entres les variables de la méthode mère et la méthode fille ?
 
PS: omega2 bonne idée d'inverser l'ordre de destruction, j'était conscient de l'illogisme dans l'ordre de mon code mais j'ai voulu faire au plus simple pour tester l'imbrication.

n°1559161
skeye
Posté le 11-05-2007 à 20:35:44  profilanswer
 

Big-Foot a écrit :

il peut pas y avoir d'intérférences entres les variables de la méthode mère et la méthode fille ?


non. Ce sont deux instances différentes de la même fonction qui sont créées, et qui n'ont aucun lien.:o


---------------
Can't buy what I want because it's free -

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Imbrication de méthodes dans une class

 

Sujets relatifs
téléchargement de fichiers en PHPConnaitre l'ensemble des méthodes d'un objet
Mettre une image sous une autre en HTML ou PHPproblème avec des méthodes inline
Utilisation d'une class de connexion Mysql[PHP] CHmod en local ?
[PHP] Aide au sujet d'une fonction et gestion d'erreur[PHP] Systeme de génération d'image avec caractères : captcha
[PHP]Champ DateComment appeler une page PHP sans iframe ?
Plus de sujets relatifs à : [PHP] Imbrication de méthodes dans une class


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR