Napisałem dla swoich potrzeb funkcję wyświetlającą menu o głębokości dwóch pozycji (kategoria + podkategoria).

Struktura bazy danych wygląda tak:

  1. id (INT)
  2. super (INT)
  3. label (VARCHAR)


przy czym kategorie nadrzędne mają id = 0.

Funkcja generuje listę <ul><li></li></ul>:

  1. <?php
  2. function menu () {
  3.  
  4. // POBRANIE IDENTYFIKATORA KATEGORII NADRZEDNEJ
  5. if ( ( isset( $_GET['cat'] ) ) && ( is_numeric( $_GET['cat'] ) ) ) {
  6. $query = "SELECT super FROM categories WHERE id = " . $_GET['cat'];
  7. $query = mysql_query( $query );
  8. $row  = mysql_fetch_array( $query );
  9. $super = $row['super'];
  10. }
  11. // POBRANIE WSZYSTKICH NADRZEDNYCH KATEGORII
  12. $query = 'SELECT id, super, label FROM categories WHERE super = 0 ORDER BY label ASC';
  13. $query = mysql_query( $query );
  14. // UTWORZENIE LISTY KATEGORII NADRZEDNYCH
  15. $output = '<ul>';
  16. while ( $row = mysql_fetch_array( $query ) ) {
  17. // WYSWIETLENIE PODKATEGORII
  18. if ( ( isset( $_GET['cat'] ) ) && ( is_numeric( $_GET['cat'] ) ) && ( ( $row['id'] == $_GET['cat'] ) || ( $row['id'] == $super ) ) ) {
  19. $output .= '<li><a href="?cat=' . $row['id'] . '" class="redb">' . $row['label'] . '</a>';
  20.  
  21. $query2 = "SELECT COUNT(id) FROM categories WHERE super = " . $row['id'];
  22. $query2 = mysql_query( $query2 );
  23. $count = mysql_fetch_array( $query2 );
  24.  
  25. if ( $count[0] > 0 ) {
  26. $query2 = 'SELECT id, super, label FROM categories WHERE super = ' . $row['id'] . ' ORDER BY label ASC';
  27. $query2 = mysql_query( $query2 );
  28. $output .= '<ul>';
  29. while ( $row2 = mysql_fetch_array( $query2 ) )
  30. $output .= '<li><a href="?cat=' . $row2['id'] . '" class="red">' . $row2['label'] . '</a></li>';
  31. $output .= '</ul>';
  32. }
  33.  
  34. $output .= '</li>';
  35. } else
  36. $output .= '<li><a href="?cat=' . $row['id'] . '">' . $row['label'] . '</a></li>';
  37. }
  38. $output .= '</ul>';
  39.  
  40. return $output;
  41.  
  42. }
  43. ?>


Aktualnie wybrana kategoria jest przekazywana poprzez
  1. <?php
  2. $_GET['cat']
  3. ?>
.

Macie jakieś pomysły na optymalizację lub zabezpieczenie tej funkcji?

W przypadku wyświetlanie podkategorii myślałem o rekurencji, ale odstąpiłem od tego pomysłu z tego względu, że dla potrzeb dwupoziomowego menu tak jest chyba prościej.