Imbrication de méthodes dans une class [PHP] - PHP - Programmation
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.
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.
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
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.
Marsh Posté le 11-05-2007 à 16:30:06
Non, la récursion n'a rien à voir avec ton soucis.
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.
Marsh Posté le 11-05-2007 à 16:39:55
raté, essaye encore.
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.
Marsh Posté le 11-05-2007 à 17:14:16
page_id n'est pas un array.
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 :
|
Marsh Posté le 11-05-2007 à 18:16:09
m'enfin pourquoi tu fais pas un deletepage directement sur chaque page dans ton while?
Marsh Posté le 11-05-2007 à 18:21:31
Ben parce que chaque page peut avoir des pages "filles" etc..
Marsh Posté le 11-05-2007 à 18:28:45
...un peu long à la détente, hein?
Code :
|
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 :
|
Marsh Posté le 11-05-2007 à 18:43:44
oui, voila...j'ai fait mon copier/coller un peu vite...
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.
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.
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:
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