Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tiago.Bast

Exclusao de menu com subcategoria

Recommended Posts

Olá pessoal, estou com um grande problema eu fiz um menu com submenus em DB Mysql me baseando pelo seguinte tutorial ( http://helpmasters.com.br/artigo/94/menu-de-infinitos-niveis-com-apenas-uma-consulta-ao-bd ) agora fiz um painel de controle e coloquei uma opçao para apagar o menu so que eu nao sei como posso fazer para quando exluir um menu com submenus e apagar todos os submenus.

 

Desde ja agradeço!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa beleza brother?

brother eu pensei nessa posibilidade so que por exemplo:

ID:1 Menu:1

ID:2 Menu:2

____ID:5 Menu:5

________ID:8 Menu:8

____________ID:9 Menu:9

____ID:6 Menu:6

____ID:7 Menu:7

ID:3 Menu:3

ID:4 Menu:4

 

Se eu quiser deletsr o Menu 5

Se eu der um DELETE FROM `menu` WHERE `menuId` = 5 OR `menuIdPai` = 5

 

Ele vai deletar o menu 5 e o Menu 8 e vai deixar os menus 9 e posteriores se tivesse.

Eu precisaria tentar criar um array que verificasse todos os IDS dos submenus do menu que esta sendo deletado tens alguma ideia de como eu poderia fazer isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo, tenta entender ..

andrey@andrey:~$ mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create schema if not exists imasters;
Query OK, 1 row affected (0.02 sec)

mysql> use imasters;
Database changed
mysql> CREATE  TABLE IF NOT EXISTS `menu` (
   ->  `menuId` INT NOT NULL AUTO_INCREMENT ,
   ->  `menuNome` VARCHAR(45) NOT NULL ,
   ->  `menuIdPai` INT NOT NULL DEFAULT 0 ,
   ->  `menuLink` VARCHAR(45) NULL ,
   ->  PRIMARY KEY (`menuId`) )
   -> ENGINE = InnoDB;
Query OK, 0 rows affected (0.23 sec)

mysql> INSERT INTO menu VALUES
   -> (1, 'A Empresa', 0, 'empresa.php'),
   -> (2, 'Sobre Nós', 1, 'sobre.php'),
   -> (3, 'Objetivos', 1, 'objetivos.php'),
   -> (4, 'Contato', 0, 'contato.php'),
   -> (5, 'Produtos', 0, 'produtos.php'),
   -> (6, 'Informática', 5, 'categoria.php?cat=informatica'),
   -> (7, 'Missão da Empresa', 2, 'missao.php'),
   -> (8, 'Visão da Empresa', 2, 'visao.php'),
   -> (9, 'Televisão', 5, 'categoria.php?cat=televisao'),
   -> (10, 'Computadores', 6, 'subcategoria.php?sub=computadores'),
   -> (11, 'Monitores', 6, 'subcategoria.php?sub=monitores');
Query OK, 11 rows affected (0.05 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> select * from menu;
+--------+-------------------+-----------+-----------------------------------+
| menuId | menuNome          | menuIdPai | menuLink                          |
+--------+-------------------+-----------+-----------------------------------+
|      1 | A Empresa         |         0 | empresa.php                       |
|      2 | Sobre Nós         |         1 | sobre.php                         |
|      3 | Objetivos         |         1 | objetivos.php                     |
|      4 | Contato           |         0 | contato.php                       |
|      5 | Produtos          |         0 | produtos.php                      |
|      6 | Informática       |         5 | categoria.php?cat=informatica     |
|      7 | Missão da Empresa |         2 | missao.php                        |
|      8 | Visão da Empresa  |         2 | visao.php                         |
|      9 | Televisão         |         5 | categoria.php?cat=televisao       |
|     10 | Computadores      |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores         |         6 | subcategoria.php?sub=monitores    |
+--------+-------------------+-----------+-----------------------------------+
11 rows in set (0.03 sec)

mysql> select * from menu where menuIdPai = 1 or menuId = 1;
+--------+-----------+-----------+---------------+
| menuId | menuNome  | menuIdPai | menuLink      |
+--------+-----------+-----------+---------------+
|      1 | A Empresa |         0 | empresa.php   |
|      2 | Sobre Nós |         1 | sobre.php     |
|      3 | Objetivos |         1 | objetivos.php |
+--------+-----------+-----------+---------------+
3 rows in set (0.03 sec)

mysql>

 

No delete, vai ser a mesma coisa

mysql> delete from menu where menuIdPai = 1 or menuId = 1;
Query OK, 3 rows affected (0.03 sec)

mysql> select * from menu;
+--------+-------------------+-----------+-----------------------------------+
| menuId | menuNome          | menuIdPai | menuLink                          |
+--------+-------------------+-----------+-----------------------------------+
|      4 | Contato           |         0 | contato.php                       |
|      5 | Produtos          |         0 | produtos.php                      |
|      6 | Informática       |         5 | categoria.php?cat=informatica     |
|      7 | Missão da Empresa |         2 | missao.php                        |
|      8 | Visão da Empresa  |         2 | visao.php                         |
|      9 | Televisão         |         5 | categoria.php?cat=televisao       |
|     10 | Computadores      |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores         |         6 | subcategoria.php?sub=monitores    |
+--------+-------------------+-----------+-----------------------------------+
8 rows in set (0.00 sec)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo ..

andrey@andrey:~$ mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use imasters;
Database changed
mysql> select * from menu;
+--------+-------------------+-----------+-----------------------------------+
| menuId | menuNome          | menuIdPai | menuLink                          |
+--------+-------------------+-----------+-----------------------------------+
|      4 | Contato           |         0 | contato.php                       |
|      5 | Produtos          |         0 | produtos.php                      |
|      6 | Informática       |         5 | categoria.php?cat=informatica     |
|      7 | Missão da Empresa |         2 | missao.php                        |
|      8 | Visão da Empresa  |         2 | visao.php                         |
|      9 | Televisão         |         5 | categoria.php?cat=televisao       |
|     10 | Computadores      |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores         |         6 | subcategoria.php?sub=monitores    |
+--------+-------------------+-----------+-----------------------------------+
8 rows in set (0.05 sec)

mysql> delete from menu where menuIdPai = 5 or menuId = 5;
Query OK, 3 rows affected (0.08 sec)

mysql> select * from menu;
+--------+-------------------+-----------+-----------------------------------+
| menuId | menuNome          | menuIdPai | menuLink                          |
+--------+-------------------+-----------+-----------------------------------+
|      4 | Contato           |         0 | contato.php                       |
|      7 | Missão da Empresa |         2 | missao.php                        |
|      8 | Visão da Empresa  |         2 | visao.php                         |
|     10 | Computadores      |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores         |         6 | subcategoria.php?sub=monitores    |
+--------+-------------------+-----------+-----------------------------------+
5 rows in set (0.00 sec)

mysql>

 

Qual o problema aí ? que o '9' foi excluído ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

veja:

 

 

|      6 | Informática       |         5 | categoria.php?cat=informatica     |

|     10 | Computadores      |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores         |         6 | subcategoria.php?sub=monitores   

se 10 e 11 são filhos do 6 q é filho do 5, então 10 e 11 devem ser excluidos tb.

 

essa é a dificuldade do criado do tópico.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certo ..

andrey@andrey:~$ mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use imasters;
Database changed
mysql> select * from menu;
+--------+-------------------+-----------+-----------------------------------+
| menuId | menuNome          | menuIdPai | menuLink                          |
+--------+-------------------+-----------+-----------------------------------+
|      1 | A Empresa         |         0 | empresa.php                       |
|      2 | Sobre Nós         |         1 | sobre.php                         |
|      3 | Objetivos         |         1 | objetivos.php                     |
|      4 | Contato           |         0 | contato.php                       |
|      5 | Produtos          |         0 | produtos.php                      |
|      6 | Informática       |         5 | categoria.php?cat=informatica     |
|      7 | Missão da Empresa |         2 | missao.php                        |
|      8 | Visão da Empresa  |         2 | visao.php                         |
|      9 | Televisão         |         5 | categoria.php?cat=televisao       |
|     10 | Computadores      |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores         |         6 | subcategoria.php?sub=monitores    |
+--------+-------------------+-----------+-----------------------------------+
11 rows in set (0.00 sec)

mysql> select * from menu where menuId = 5 or menuIdPai in( ( select menuId from menu where menuIdPai = 5 ) );
+--------+--------------+-----------+-----------------------------------+
| menuId | menuNome     | menuIdPai | menuLink                          |
+--------+--------------+-----------+-----------------------------------+
|      5 | Produtos     |         0 | produtos.php                      |
|     10 | Computadores |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores    |         6 | subcategoria.php?sub=monitores    |
+--------+--------------+-----------+-----------------------------------+
3 rows in set (0.03 sec)

mysql> select * from menu where menuId = 5 or menuIdPai in( ( select menuId from menu where menuIdPai = 5 or menuId = 5 ) );
+--------+--------------+-----------+-----------------------------------+
| menuId | menuNome     | menuIdPai | menuLink                          |
+--------+--------------+-----------+-----------------------------------+
|      5 | Produtos     |         0 | produtos.php                      |
|      6 | Informática  |         5 | categoria.php?cat=informatica     |
|      9 | Televisão    |         5 | categoria.php?cat=televisao       |
|     10 | Computadores |         6 | subcategoria.php?sub=computadores |
|     11 | Monitores    |         6 | subcategoria.php?sub=monitores    |
+--------+--------------+-----------+-----------------------------------+
5 rows in set (0.00 sec)

mysql>

 

Mesma coisa vale pro DELETE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos obrigado pela ajuda mas esse sql me ajuda em partes pois se menu que tiver mais de 3 subniveis ele ja nao apaga os outros subniveis teria como adicionar um looping que verifique todos os niveis para poder apagar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faz assim ..

delete m, children from menu m left join menu children on children.menuId = m.menuIdPai
where children.menuId is not null and children.menuId = 5 or children.menuIdPai = 5
or m.menuId = 5

 

É melhor que fazer gambiarra com aquela quantidade de subquery.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é nenhum valor, elas são alias de 'menu', você vai ter excluindo da tabela 'menu' normalmente.

Perceba que:

delete m, children from 
      menu m  /* Tabela Menu, Alias Menu */
left join 
      menu children /* Tabela Menu, Alias Children */
on children.menuId = m.menuIdPai where children.menuId is not null and children.menuId = 5 
or children.menuIdPai = 5 or m.menuId = 5

Compartilhar este post


Link para o post
Compartilhar em outros sites

brother tentei colocar assim no meu sql

[sql] delete m, children from 
      menus m  
left join 
      menus children 
on children.ID_Menu = m.Herda_Menu where children.ID_Menu is not null and children.ID_Menu = 37 
or children.Herda_Menu = 37 or m.ID_Menu = 37

Affected rows: 0
Time: 0.002ms

e nao deleta nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao consegui brother os nomes das minhas tabelas estao da seguinte forma:

ID_Menu 	Secao_Menu 	Herda_Menu 	Ordem_Menu 	Nome_Menu 	Desc_Menu 	Tipo_Menu 	Link_Menu

o que achas que poderia ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou dar a minha versão de como poderia ser feito.

 

Banco de dados test, tabela menu

--
-- Banco de Dados: `test`
--
CREATE DATABASE `test` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `test`;

-- --------------------------------------------------------

--
-- Estrutura da tabela `menu`
--

CREATE TABLE IF NOT EXISTS `menu` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `parent_id` int(11) NOT NULL DEFAULT '0',
 `super_parent_id` int(11) NOT NULL DEFAULT '0',
 `title` varchar(15) NOT NULL,
 `url` varchar(100) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

--
-- Extraindo dados da tabela `menu`
--

INSERT INTO `menu` (`id`, `parent_id`, `super_parent_id`, `title`, `url`) VALUES
(1, 0, 1, 'Menu1', '#'),
(2, 1, 1, 'Submenu1', '#'),
(3, 1, 1, 'Submenu2', '#'),
(4, 3, 1, 'SubSubmenu1', '#'),
(5, 3, 1, 'SubSubmenu2', '#'),
(6, 4, 1, 'SubSubSubMenu1', '#'),
(7, 4, 1, 'SubSubSubMenu2', '#'),
(8, 0, 8, 'Menu2', '#'),
(9, 8, 8, 'SubMenu1', '#');

 

Classe para montar o menu

<?php

class Menu
{
   private $_parents;
   private $_children;
   private $_storage;
   public function __construct( $menus )
   {
       foreach( $menus as $menu )
       {
           if( $menu[ 'parent_id' ] == 0 )
           {
               $this->_parents[ $menu[ 'id' ] ] [ ] = $menu;
           }
           else
           {
               $this->_children[ $menu[ 'parent_id' ] ] [ ] = $menu;
           }
       }
   }
   private function outputOpen( $menu, $depth )
   {
       if( $depth == 0 )
       {
           $this->_storage[ ] = sprintf( '<li><a href="%s" title="">%s</a>', $menu[ 'url' ], $menu[ 'title' ] );
       }
       else
       {
           $this->_storage[ ] = '<ul>';
           $this->_storage[ ] = sprintf( '<li><a href="%s" title="">%s</a></li>', $menu[ 'url' ], $menu[ 'title' ] );
       }
   }
   private function outputClosed( $depth )
   {
       $this->_storage[ ] = ( $depth == 0 ) ? '</li>' : '</ul>';
   }
   private function printParent( $menus, $depth = 0 )
   {
       foreach( $menus as $menu )
       {
           $this->outputOpen( $menu, $depth );

           if( isset( $this->_children[ $menu[ 'id' ] ] ) )
           {
               $this->printParent( $this->_children[ $menu[ 'id' ] ], $depth + 1 );
           }
           $this->outputClosed( $depth );
       }
   }
   public function printMenus( )
   {
       foreach( $this->_parents as $menus )
       {
           $this->printParent( $menus );
       }
       echo implode( PHP_EOL, $this->_storage );
   }
}

 

Página de testes

<?php

$conn  = mysql_connect( 'localhost', 'root', '' );
mysql_select_db( 'test', $conn );
$sql   = 'SELECT * FROM `menu`';
$query = mysql_query( $sql, $conn );

while( $row = mysql_fetch_assoc( $query ) )
{
   $menu[ ] = $row;
}

$menus = new Menu( $menu );
$menus->printMenus( );

unset( $menu, $menus );
echo '<hr>';

$sql = 'DELETE FROM `menu` WHERE `super_parent_id` = 1';
mysql_query( $sql, $conn );

$sql   = 'SELECT * FROM `menu`';
$query = mysql_query( $sql, $conn );

while( $row = mysql_fetch_assoc( $query ) )
{
   $menu[ ] = $row;
}

$menus = new Menu( $menu );
$menus->printMenus( );

?>

 

 

Resultado

Menu1

   Submenu1

   Submenu2
       SubSubmenu1
           SubSubSubMenu1
           SubSubSubMenu2
       SubSubmenu2

Menu2

   SubMenu1
------------------------------------
Menu2

   SubMenu1


Compartilhar este post


Link para o post
Compartilhar em outros sites

Dae Carlos, seguinte esse seu codigo voce pode deletar qualquer menu ou submenu e sera excluido todos os seus filhos?

 

Andrey, com o sql q tu me passou agora esta apagando até o menu pai do submenu que deseja excluir.

 

Bah pessoal ja to no desespero heheheheh!!

Eu tenho o valor do ID que é informado via post Como eu consigo fazero seguinte looping:

1: Pega o valor do Post : Exemplo 45

2: Verifica se existe algum Indice com Valor 45

3: se existir pega todos os valores do segundo indice e adiciona a uma outra array

4: e ainda com os valores do segundo indice verifica se existe no primeiro indice

5: se existir faz o mesmo que o item 3

6: ai volta para o 4 item

 

Assim ter todos os ID's dos menus e submenus que poderam ser deletados.

 

Array
(
   [0] => Array
       (
           [45] => Array
               (
                   [iD] => 45
                   [Nome] => 3
                   [Tipo] => ModEvC
                   [Ordem] => 3
               )

       )

   [45] => Array
       (
           [50] => Array
               (
                   [iD] => 50
                   [Nome] => 111
                   [Tipo] => ModEvO
                   [Ordem] => 1
               )

       )

   [50] => Array
       (
           [51] => Array
               (
                   [iD] => 51
                   [Nome] => 222
                   [Tipo] => ModEvC
                   [Ordem] => 1
               )

           [52] => Array
               (
                   [iD] => 52
                   [Nome] => 444
                   [Tipo] => ModEvC
                   [Ordem] => 2
               )

       )

)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, então é só tirar o último 'or' da sql .. ficando assim:

delete m, children from menu m left join menu children 
on children.menuId = m.menuIdPai where children.menuId is not null and children.menuId = 5 
or children.menuIdPai = 5

 

Veja a diferença de com o 'or' e sem o 'or'.

andrey@andrey:~$ mysql -u root -p
Enter password: ************
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.41 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create schema imasters;
Query OK, 1 row affected (0.00 sec)

mysql> use imasters;
Database changed
mysql> CREATE  TABLE IF NOT EXISTS `menu` (
   ->  `menuId` INT NOT NULL AUTO_INCREMENT ,
   ->  `menuNome` VARCHAR(45) NOT NULL ,
   ->  `menuIdPai` INT NOT NULL DEFAULT 0 ,
   ->  `menuLink` VARCHAR(45) NULL ,
   ->  PRIMARY KEY (`menuId`) )
   -> ENGINE = InnoDB;
Query OK, 0 rows affected (0.11 sec)

mysql> INSERT INTO menu VALUES
   -> (1, 'A Empresa', 0, 'empresa.php'),
   -> (2, 'Sobre Nós', 1, 'sobre.php'),
   -> (3, 'Objetivos', 1, 'objetivos.php'),
   -> (4, 'Contato', 0, 'contato.php'),
   -> (5, 'Produtos', 0, 'produtos.php'),
   -> (6, 'Informática', 5, 'categoria.php?cat=informatica'),
   -> (7, 'Missão da Empresa', 2, 'missao.php'),
   -> (8, 'Visão da Empresa', 2, 'visao.php'),
   -> (9, 'Televisão', 5, 'categoria.php?cat=televisao'),
   -> (10, 'Computadores', 6, 'subcategoria.php?sub=computadores'),
   -> (11, 'Monitores', 6, 'subcategoria.php?sub=monitores');
Query OK, 11 rows affected (0.03 sec)
Records: 11  Duplicates: 0  Warnings: 0

mysql> select m.menuId, m.menuNome from menu m left join menu children
   -> on children.menuId = m.menuIdPai where children.menuId is not null and children.menuId = 5
   -> or children.menuIdPai = 5 or m.menuId = 5;
+--------+--------------+
| menuId | menuNome     |
+--------+--------------+
|      5 | Produtos     |
|      6 | Informática  |
|      9 | Televisão    |
|     10 | Computadores |
|     11 | Monitores    |
+--------+--------------+
5 rows in set (0.00 sec)

mysql> select m.menuId, m.menuNome from menu m left join menu children
   -> on children.menuId = m.menuIdPai where children.menuId is not null and children.menuId = 5
   -> or children.menuIdPai = 5;
+--------+--------------+
| menuId | menuNome     |
+--------+--------------+
|      6 | Informática  |
|      9 | Televisão    |
|     10 | Computadores |
|     11 | Monitores    |
+--------+--------------+
4 rows in set (0.00 sec)

mysql>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.