[PHP] Imbrication de méthodes dans une class

Imbrication de méthodes dans une class [PHP] - PHP - Programmation

Marsh Posté le 11-05-2007 à 16:19:00    

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
Reply

Marsh Posté le 11-05-2007 à 16:19:00   

Reply

Marsh Posté le 11-05-2007 à 16:24:41    

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 -
Reply

Marsh Posté le 11-05-2007 à 16:28:40    

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.

Reply

Marsh Posté le 11-05-2007 à 16:28:53    

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
Reply

Marsh Posté le 11-05-2007 à 16:30:06    

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 -
Reply

Marsh Posté le 11-05-2007 à 16:34:39    

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.

Reply

Marsh Posté le 11-05-2007 à 16:39:55    

raté, essaye encore.


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

Marsh Posté le 11-05-2007 à 16:57:19    

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.

Reply

Marsh Posté le 11-05-2007 à 17:14:16    

page_id n'est pas un array.


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

Marsh Posté le 11-05-2007 à 18:12:32    

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
Reply

Marsh Posté le 11-05-2007 à 18:12:32   

Reply

Marsh Posté le 11-05-2007 à 18:16:09    

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 -
Reply

Marsh Posté le 11-05-2007 à 18:21:31    

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

Reply

Marsh Posté le 11-05-2007 à 18:28:45    

...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 -
Reply

Marsh Posté le 11-05-2007 à 18:37:28    

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. }


Reply

Marsh Posté le 11-05-2007 à 18:43:44    

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


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

Marsh Posté le 11-05-2007 à 18:54:59    

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.

Reply

Marsh Posté le 11-05-2007 à 20:35:44    

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 -
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed