Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Wielopoziomowe menu
Miedziaq
post 14.09.2013, 15:59:57
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.03.2011

Ostrzeżenie: (0%)
-----


Witam,

chciałbym prosić o pomoc w rozwiązaniu problemu nad którym siedze już bardzo długo i do niczego logicznego nie potrafie dojść
otóż chce zrobić menu z podkategoriami

menu1
>submenu1
>>subsub1
>>subsub2
>submenu2
>>subsub1
>>subsub2
menu2
>submenu1
>>subsub1
>>subsub2
>submenu2
>>subsub1
>>subsub2

wyświetlane w ten sposób, umieściłem wszystko w jednej tabeli mysql

Próbuje to teraz wyświetlic na stronie jednak nie bardzo mi to wychodzi.
Domyślam się że powinienem tutaj wykonać pętle w pętli jednak nic z tego..
Bardzo prosze o pomoc, do odczytu z bazy używam obiektowego mysqli.
Kod
$query = "select * from categories where product_type='B';";
    $result = $mysqli->query($query);
    $row = $result->fetch_all();


Dodam że przy takim kodzie
Kod
$query = "select * from categories where product_type='B';";
    $arr = array();
    $i=0;
    $result = $mysqli->query($query);
    while($row = $result->fetch_assoc())
    {
    $arr[$i++]=$row;
    }
    
    print_r($arr);


wypluwa mi

Kod
Array ( [0] => Array ( [category] => 0 [subcategory] => 0 [subsub] => 0 [name] => Informatyka [product_type] => B )
    [1] => Array ( [category] => 1 [subcategory] => 0 [subsub] => 0 [name] => Psychologia [product_type] => B )
    [2] => Array ( [category] => 2 [subcategory] => 0 [subsub] => 0 [name] => Sport [product_type] => B )
    [3] => Array ( [category] => 0 [subcategory] => 1 [subsub] => 0 [name] => Programowanie [product_type] => B )
    [4] => Array ( [category] => 0 [subcategory] => 2 [subsub] => 0 [name] => Projektowanie [product_type] => B )
    [5] => Array ( [category] => 0 [subcategory] => 1 [subsub] => 1 [name] => php [product_type] => B )
    [6] => Array ( [category] => 0 [subcategory] => 1 [subsub] => 2 [name] => ajax [product_type] => B )
    [7] => Array ( [category] => 0 [subcategory] => 1 [subsub] => 3 [name] => mysql [product_type] => B )
    [8] => Array ( [category] => 0 [subcategory] => 2 [subsub] => 1 [name] => photoshop [product_type] => B )
    [9] => Array ( [category] => 0 [subcategory] => 2 [subsub] => 1 [name] => gimp [product_type] => B ) )


jednak nadal nie wiem jak sie dostać do tego...

być może w zły sposób próbuje to rozwiązać ale zależy mi aby było to w jednej tabeli.

Ten post edytował Miedziaq 14.09.2013, 17:46:11
Go to the top of the page
+Quote Post
aras785
post 14.09.2013, 20:50:15
Post #2





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


A gdzie jakieś id...


o coś takiego Ci chodzi?

http://codepad.org/rqsT0NPf

Ten post edytował aras785 14.09.2013, 21:13:40
Go to the top of the page
+Quote Post
Miedziaq
post 14.09.2013, 22:46:53
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.03.2011

Ostrzeżenie: (0%)
-----


nie, o coś takiego



już mi się udało to zrobić wykorzystując metodę id | id nadrzednego
i funkcje rekurencyjną

Dzieki za pomoc
Pozdrawiam.

Ten post edytował Miedziaq 14.09.2013, 22:48:54
Go to the top of the page
+Quote Post
aras785
post 14.09.2013, 23:00:53
Post #4





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


No to baze którą dałeś wskazywała na coś innego i nie dało się tego zrobić według tej bazy. Dobrze, że się udało smile.gif Pozdrawiam
Go to the top of the page
+Quote Post
Miedziaq
post 14.09.2013, 23:19:40
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 19.03.2011

Ostrzeżenie: (0%)
-----


tak ponieważ taką miałem wizje jednak internet i kilkanascie godzin zabawy naprowadziły mnie na ten trop.

Napotkałem jednak kolejny problem

mam taki kod

Kod
function show_categories($parent)
{
  
      // Potrzebna jest globalna tablica $tasks:
      global $categories;
  
      // Rozpoczynamy listę:
      echo '<ul>';
      
      // Przetwarzanie w pętli wszystkich tablic podrzędnych:
      foreach ($parent as $category_id => $name) {
          
          // Wyświetlenie elementu:
          echo "<li>$name";
              
          // Sprawdzenie, czy z zadaniem są powiązane zadania podrzędne:
          if (isset($categories[$category_id])) {
              
              // Wywołanie funkcji:
              show_categories($categories[$category_id]);
              
          }
              
          // Wyświetlenie elementu:
          echo '</li>';
      
      } // Koniec pętli FOREACH.
      
      // Zamykamy uporządkowaną listę:
      echo '</ul>';
  
} // Koniec funkcji show_categories().


// Nawiązanie połączenia z bazą danych.
  $dbc = @mysqli_connect ('localhost', 'root', '3531734', 'rentaloffice') OR die ('<p>Nie można połączyć się z bazą danych!</p></body></html>');

// Pobranie wszystkich niezakończonych zadań:
$q = 'SELECT cat_id, subcat, name FROM categories2 WHERE product_type="'.$product_type.'"
ORDER BY subcat ASC';

  $r = mysqli_query($dbc, $q);
  
  // Zainicjowanie tablicy:
  $categories = array();
  
  while(list($category_id, $subcat, $name) = mysqli_fetch_array($r, MYSQLI_NUM)) {
  
      // Dodanie zadania do tablicy:
      $categories[$subcat][$category_id] = $name;
  
  }
  
  // Dla celów diagnostycznych:
  //echo '<pre>' . print_r($categories,1) . '</pre>';
  
  // Przesłanie pierwszego elementu tablicy
  // do funkcji make_list():
  show_categories($categories[0]);


działa pięknie jednak jeśli utworze funkcje w ten sposób

Kod
function show_categories($parent)
{
  
      // Potrzebna jest globalna tablica $tasks:
      global $categories;
  
      // Rozpoczynamy listę:
      echo '<ul>';
      
      // Przetwarzanie w pętli wszystkich tablic podrzędnych:
      foreach ($parent as $category_id => $name) {
          
          // Wyświetlenie elementu:
          echo "<li>$name";
              
          // Sprawdzenie, czy z zadaniem są powiązane zadania podrzędne:
          if (isset($categories[$category_id])) {
              
              // Wywołanie funkcji:
              show_categories($categories[$category_id]);
              
          }
              
          // Wyświetlenie elementu:
          echo '</li>';
      
      } // Koniec pętli FOREACH.
      
      // Zamykamy uporządkowaną listę:
      echo '</ul>';
  
} // Koniec funkcji show_categories().


function show_categories_menu($product_type)
{
    // Nawiązanie połączenia z bazą danych.
  $dbc = @mysqli_connect ('localhost', 'root', 'xxx', 'rentaloffice') OR die ('<p>Nie można połączyć się z bazą danych!</p></body></html>');

// Pobranie wszystkich niezakończonych zadań:
$q = 'SELECT cat_id, subcat, name FROM categories2 WHERE product_type="'.$product_type.'"
ORDER BY subcat ASC';

  $r = mysqli_query($dbc, $q);
  
  // Zainicjowanie tablicy:
  $categories = array();
  
  while(list($category_id, $subcat, $name) = mysqli_fetch_array($r, MYSQLI_NUM)) {
  
      // Dodanie zadania do tablicy:
      $categories[$subcat][$category_id] = $name;
  
  }
  
  // Dla celów diagnostycznych:
  //echo '<pre>' . print_r($categories,1) . '</pre>';
  
  // Przesłanie pierwszego elementu tablicy
  // do funkcji make_list():
  show_categories($categories[0]);
}


to wywołuje wczytuje menu ale tylko pierwszy poziom, czyli nie działa rekurencja, czy mielibyscie jakies wskazówki jak to rozwiazac?

Problem rozwiązany wystarczyło dodac global $categories.

Ten post edytował Miedziaq 15.09.2013, 00:15:35
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.06.2025 - 17:55