Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja kodu, instrukcja switch
alkamid
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 27.12.2006

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


Cześć!

Napisałem pewien prosty skrypt php i chcę go teraz zoptymalizować. Mam jedną zagwozdkę, na którą nie mam pomysłu. Oto ona:

W skrypcie ważną rolę odgrywa zmienna miesiąc wybrana przez użytkownika - chodzi o to, że użytkownik ma do wyboru kilka miesięcy, przekazuje wybór za pomocą $_GET, a następnie wyświetlane są dane z wybranego miesiąca.
Jest jednak mały problem: jeśli istnieją dane z miesiąca poprzedniego, to ostatni ich wiersz musi się pojawić w bieżącym zestawieniu. Zmienna $_GET['mth'] (czyli ta przechowująca aktualnie wybrany miesiąc) ma format MM, a zapytanie sql które stosuję do wyciągnięcia wierszy z danego miesiąca:
  1. SELECT DATA, wartosc FROM fw WHERE DATA LIKE "%-'.$_GET['mth'].'-%" ORDER BY DATA ASC;

Jeśli nie widać tego od razu, to tłumaczę: dla marca zapytanie to wyszukuje wyrazów z "-03-", dla kwietnia z "-04" etc.
Żeby pobrać ostatni wiersz z poprzedniego miesiąca stosuję:
  1. SELECT wartosc FROM fw WHERE DATA LIKE "%-'.$prev.'-%" ORDER BY DATA DESC LIMIT 1 ;


Niestety, zmienną $prev otrzymuję w nieelegancki sposób, a mianowicie instrukcją switch:
  1. <?php
  2. switch($_GET['mth']) { // ustawienie poprzedniego miesiąca... jakby to zrobić krócej?
  3.        case '02':
  4.            $prev='01';
  5.            break;
  6.        case '03':
  7.            $prev='02';
  8.            break;
  9.        case '04':
  10.            $prev='03';
  11.            break;
  12.        case '05':
  13.            $prev='04';
  14.            break;
  15.        case '06':
  16.            $prev='05';
  17.            break;
  18.        case '07':
  19.            $prev='06';
  20.            break;
  21.        case '08':
  22.            $prev='07';
  23.            break;
  24.        case '09':
  25.            $prev='08';
  26.            break;
  27.        case '10':
  28.            $prev='09';
  29.            break;
  30.        case '11':
  31.            $prev='10';
  32.            break;
  33.        case '12':
  34.            $prev='11';
  35.            break;
  36.        }
  37. ?>


Nie wiem jednak jak zrobić to inaczej, bo zmienna $_GET['mth'] nie jest przecież liczbą, więc nie mogę po prostu odjąć od niej jedności.
Bardzo proszę o wskazówki - być może już sam pomysł na pobieranie wierszy z danego miesiąca jest zbyt skomplikowane, bo można to zrobić za pomocą narzędzi ukrytych w MySQL, kto wie?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
alkamid
post
Post #2





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 27.12.2006

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


Cytat(dr_bonzo @ 28.03.2009, 13:40:00 ) *
A pozatym jesli trzymasz daty w bazie jako DATE to mozesz uzyc mysqlowej funkcji MONTH() i sobie porownujesz normalnie z 1, 4, 12, 11

Świetne, właśnie o to mi chodziło. Wielkie dzięki!

To jeszcze jedno: do wyświetlenia listy dostępnych miesięcy używam takiej konstrukcji:
  1. <?php
  2. $months_exist = 'SELECT data FROM fw;'; // sprawdza jakie miesiące istnieją w bazie
  3.  
  4.    if($zap0 = $mysqli->query($months_exist)) {
  5.        
  6.        $months_num_rows = $zap0->num_rows;
  7.        
  8.        for($i=0; $i<$months_num_rows; $i++) {
  9.            $months_element = $zap0->fetch_assoc();
  10.            for($j=1; $j<13; $j++) { // jeśli znajdzie datę która zawiera w sobie j (1-12), to przypisze elementowi tablicy $miesiace $j (do wydrukowania listy)
  11.                if (($j<10) && (preg_match("/-0".$j."-/", $months_element['data'])))
  12.                    $miesiace[$j] = "0".$j;
  13.                elseif (($j>9) && (preg_match("/-".$j."-/", $months_element['data'])))
  14.                    $miesiace[$j] = $j;
  15.                
  16.            }
  17.        }
  18.    }
  19. ?>

Co też jest trochę głupie, bo muszę robić dwa przypadki dla j od 1 do 9 i od 10 do 12. Skoro już się uporałem z tamtym to tu też mogłyby być liczby w zwykłym formacie: 1,2,3...
Wyobrażam sobie to tak:
  1. <?php
  2. if($j == month($months_element['data']))
  3. $miesiace[$j] = $j;
  4. ?>

Tylko w php nie ma funkcji tak samo działającej jak ta w MySQL, tzn. pewnie jest ale ja się nie mogę jej doszukać.

Ten post edytował alkamid 28.03.2009, 14:03:25
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 14.10.2025 - 10:18