1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Função recursiva com Mysql

Discussão em 'Web Development' iniciada por busterkika, 20 de Fevereiro de 2009. (Respostas: 3; Visualizações: 3745)

  1. tenho uma tabela em SQL feita com a seguinte estrutura:
    id | menu | dep | url

    id - numeração automatica
    menu - Text
    dep - Int
    url - Text

    Para que serve? R: Esta tabela gera um menu com sub-menus ilimitados.Isto é, é criado varios menus iniciais com dep "-1" e todos os outros k não tem dep = -1 estão pendurados num menu valido. Ex:
    0 | menu1 | -1 | #
    1 | menu2 | -1 | #
    2 | menu3 | -1 | #
    4 | submenu1 | 0 | #
    5 | submenu2 | 4 | #
    6 | submenu3 | 4 | #
    7 | submenu4 | 5 | #

    Estrutura:
    menu1
    submenu1
    submenu2
    submenu4
    submenu3
    menu2
    menu3

    Isto esta tudo a funcionar excepto o codigo de eliminar um dos menus. Isto é: Imaginem que desejo eliminar o menu1. Terei de criar uma função que lista todos os items do menu1 e em cada item desses, terei de voltar a listar o seu conteudo eliminando assim sempre a "cauda" com o metodo de recursividade. (sei que esta mal explicado mas acho k deu para perceber)

    O codigo que estou a utilizar para fazer isso é este:

    1. function elimina_dados($menu) {
    2.
    3. $sql2 = "SELECT * FROM menu where id='$menu'";
    4. $sql2 = mysql_query( $sql2 );
    5. while( $B = mysql_fetch_array( $sql2 ) ) {
    6. $nr = $B['id'];
    7. print $nr;
    8. elimina_dados($nr);
    9. $del = mysql_query( "DELETE FROM menu WHERE id='$temp'" );
    10. mysql_query( $del );
    11. }
    12. }

    elimina_dados(0);

    O unico problema disto é que não funciona... mas se comentar a linha 8 já funciona mas não elimina os submenus desse menu eliminado. Alguem sabe o que está mal aqui? será que tenho de declarar a função para fazer a recursividade da mesma? e como faço isso!?


    P.S. - Ja procurei no google... nada, não encontro nada deste genero.
     
  2. CyberOps

    CyberOps I'm cool cuz I Fold

    tens umas funções para usar em estruturas tipo em arvore: connect by prior

    um exemplo:
    Código:
    (select info.object_id
               from dssmdobjinfo info
              where info.object_type = 12
                and info.subtype = 3072
              start with info.object_id = '6E59DF8F4E3309F11AA3EBA87ED29C03'
             CONNECT BY PRIOR info.object_id = info.parent_id) 
    
    este sql usei para sakar objectos usados numa hierarquia de pastas. pode ser que te ajude
     
    Última edição: 20 de Fevereiro de 2009
  3. pois... mas assim deveria funcionar certo?

    Provavelmente vou utilizar este método para outras coisas e a recursividade era óptima.
     
  4. Descobri o problema... ciclo infinito. A correcção esta a <b>BOLD</b>

    1. function elimina_dados($menu) {
    2.
    3. $sql2 = "SELECT * FROM menu where <b>dep</b>='$menu'";
    4. $sql2 = mysql_query( $sql2 );
    5. while( $B = mysql_fetch_array( $sql2 ) ) {
    6. $nr = $B['id'];
    7. print $nr;
    8. elimina_dados($nr);
    9. $del = mysql_query( "DELETE FROM menu WHERE id='$temp'" );
    10. mysql_query( $del );
    11. }
    12. }

    Problema resolvido ;)


    P.S. - CyberOps obrigado pelo ajuda ;)
     

Partilhar esta Página