Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: switch() i zmienna liczba case
Forum PHP.pl > Forum > PHP
tomek_swat
witam
postaram się w miarę jasno napisać na czym polega mój problem, otórz mam funkcję
  1. <?php
  2. function wysw_kategorie(){
  3.  
  4. if(polaczenie()){
  5. $query = "SELECT IdKategorii, NazwaK FROM Kategoria";
  6. $result = mysql_query($query);
  7.  
  8. echo '<ul id="kategorie">';
  9.  
  10. while(list($id,$nazwa)= mysql_fetch_row($result)){
  11. echo '
  12. <li><a href="?m='.$id.'">'.$nazwa.'</a></li>';
  13. } 
  14. echo '</ul>';
  15. }
  16. else {
  17. echo 'Nie połączono';
  18. }
  19.  
  20.  
  21. }
  22. ?>

która wypisuje mi linki jako elementy listy, pobiera dane z bazy tak jak chce, w pewnym miejscu w pliku index.php mam:

  1. <?php
  2. switch ($_GET['m']) {
  3. case 'produkty':
  4. echo 'produkty';
  5. break;
  6. case 'regulamin':
  7. echo 'regulamin';
  8. break;
  9. case 'rozmiary':
  10. echo 'rozmiary';
  11. break;
  12. case 'kontakt':
  13. echo 'kontakt';
  14. break;
  15. case 'koszyk':
  16. echo 'koszyk';
  17. break;
  18. default:
  19. echo 'strona główna';
  20. break;
  21. }
  22. ?>

problem polega na tym jak to sprytnie rozwiązać, żeby liczba case`ów obsługiwała liczbę kategorii znajdujących się w bazie, aby nie trzeba było wpisywać tego na sztywno?

pzdr
piraciq
jeżeli używasz tego tylko do wyswietlania to przecież możesz wylistować z bazy podobnie jak masz wyzej
Cysiaczek
Najprostszy i jednocześnie bardzo skuteczny sposób, to wyciągnięcie z bazy wszystkich kategorii, umieszczenie ich w tablicy tak, aby kluczem była np jej nazwa (lub identyfikator) a wartością nazwa akcji do wykonania (czyli to, co ma się znaleźć z konkretnym case). Taka tablice można zserializować i trzymać w cache.

Drugi sposób jest podobny, ale bazuje na zapytaniu do bazy danych o rekord konkretnej kategorii. W tym rekordzie w którymś z pól, powinna być zawarta informacja i tym, co ma wyświetlić lub nazwa funkcji do wywołania.

Trzecie, najlepsze rozwiązanie to użycie jakiegoś frameworka i nie zawracanie sobie głowy takimi pierdołami ;]

Pozdrawiam
ddiceman
  1. <?php
  2. $arrKategorie = array();
  3.  
  4. function wysw_kategorie(){
  5. global $arrKategorie;
  6.  
  7. if(polaczenie()){
  8. $query = "SELECT IdKategorii, NazwaK FROM Kategoria";
  9. $result = mysql_query($query);
  10.  
  11. echo '<ul id="kategorie">';
  12.  
  13. while(list($id,$nazwa)= mysql_fetch_row($result)){
  14. $arrKategorie[$id] = $nazwa; // uzupelnianie globalnej tablicy zawierajacej nazwy kategorii
  15. echo '
  16. <li><a href="?m='.$id.'">'.$nazwa.'</a></li>';
  17. } 
  18. echo '</ul>';
  19. }
  20. else {
  21. echo 'Nie połączono';
  22. }
  23.  
  24.  
  25. }
  26. ?>

  1. <?php
  2. //sprawdzanie, czy dany element istnieje na liscie kategorii
  3.  if(in_array($_GET['m'], $arrKategorie))
  4.  echo $_GET['m'];
  5.  else 
  6.  echo 'strona główna';
  7. ?>
tomek_swat
zastosowanie funkcji in_array() nie działa tak jak powinno, działa natomiast
  1. <?php
  2. echo $arrKategorie[$_GET['m']];
  3. ?>

a gdy napiszę
  1. <?php
  2. if(in_array($_GET['m'], $arrKategorie)){
  3. echo $arrKategorie[$_GET['m']];
  4. }
  5. else 'brak';
  6. ?>

to już nic nie wyskakuję, problem nadal pozostaję i rozszerza się o wywołanie odpowiednij akcji w zależności od $_GET['m']
chodzi mi o to by, pobierało $_GET['m'] sprawdzało czy taki element jest w tablicy jeśli tak to uruchamia funkcja($_GET['m']) jeśli nie to wypisuję brak

pzdr
ddiceman
  1. <?php
  2. if(in_array($_GET['m'], $arrKategorie)){
  3. echo $arrKategorie[$_GET['m']];
  4. }
  5. else 'brak';
  6. ?>


Ten kod nie moze dzialac ze wzgledu na linie 3 - kluczem tabeli $arrKategorie jest id a nie nazwa kategorii. Dlatego, tak jak Ci podalem wczesniej:

  1. <?php
  2. if(in_array($_GET['m'], $arrKategorie)){
  3. jakasfunkcja($_GET['m']); // argumentem jest $_GET['m'] a nie $arrKategorie[$_GET['m']]
  4. }
  5. else 'brak';
  6. ?>
tomek_swat
to rozwiązanie nie działa, zastanawiam się czemu zawsze zwraca, że tego elementu nie ma w tablicy, skoro powinien tam być.
To nie działa:
  1. <?php
  2. if(in_array($_GET['m'], $arrKategorie)){  
  3. wysw_produkt_kat($_GET['m']);
  4.  }
  5. ?>

a samo to działa:
  1. <?php
  2. wysw_produkt_kat($_GET['m']);
  3. ?>


dobrze by było choćby ze względu na bezpieczeństwo by pierwsza wersja działała
pzdr
ddiceman
sprawdz, czy poprawnie tworzy Ci sie zmienna $arrKategorie: przed naszym pseudo-switchem dodaj
  1. <?php
  2. print_r($arrKategorie
  3. ?>
- jezeli ta tablica utworzyla sie poprawnie to powinna zawierac wszystkie nazwy kategorii, jakie masz w serwisie. A z tego, co piszesz ona gdzies Ci sie nie tworzy - moze najpierw sie do niej odwolujesz a pozniej wywolujesz wysw_kategorie();, ktora powinna zmienna $arrKategorie wypelnic?
tomek_swat
hmm ciężka sprawa, niby wszystko działa tak jak bym chciał ale zważszywszy na bezpieczeństwo nadal to niedziała
  1. <?php
  2. echo $arrKategorie[$_GET['m']].'<br />';
  3. print_r($arrKategorie);
  4.  
  5. if(in_array($_GET['m'], $arrKategorie)){  
  6. wysw_produkt_kat($_GET['m']);
  7. }
  8. ?>

Array ( [1] => Koszulki [2] => Komplety [3] => Piżamy [4] => XXL [5] => Akcesoria [6] => Bbb [7] => Bddd [8] => Bivv [9] => Klapki [10] => Kozaki [11] => Botki [12] => Koturny [14] => Gaciee [15] => tom )

i gdy nasz 'switch' jest zakomentowany normalnie wyświetla mi produkty z danej kategorii a gdy go aktywuje nie działa
Vertical
A eval? Robisz string, w którym dopisujesz w pętli kolejne case i odpalasz to evalem.
tomek_swat
Cytat(Vertical @ 24.07.2008, 16:47:30 ) *
A eval? Robisz string, w którym dopisujesz w pętli kolejne case i odpalasz to evalem.

mógłbyś jaśniej napisać co masz na myśli
pzdr
ddiceman
in_array() zostalo wprowadzone powyzej PHP4 i w tym przypadku na pewno powinno Ci dzialac. Zobacz, co zawiera zmienna $arrKategorie tuz przed sprawdzeniem in_array().

Na pewno nie popelniles jakiejs literowki? Bo z tego, co napisales wynika, ze zmienna $arrKategorie[$_GET['m']] masz pusta (tak powinno byc) a tablice $arrKategorie poprawnie wypelniona wartosciami. W tej sytuacji rozwiazanie, o ktorym dyskutowalismy powinno dzialac. Sprawdz:
  1. <?php
  2. echo("arrkategorie:\n");
  3. print_r($arrKategorie);
  4.  
  5. if(in_array($_GET['m'], $arrKategorie)){  
  6. echo('znalazlem '.$_GET['m']);
  7. }
  8. else{
  9. echo('nie znalazlem '.$_GET['m']);
  10. }
  11. ?>
Vertical
Chodzi mi o to, że jeśli to miałoby być przez switch(), można to zrobić tak (chyba, że źle zrozumiałem problem):
  1. <?php
  2. $str = "switch($_GET['m']) {";
  3. foreach($arrKategorie as $val) {
  4. $str .= "case ".$val.":
  5. echo '".$val."';
  6. break;";
  7. }
  8. $str .= "}";
  9. eval($str);
  10. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.