Początkujący programiści często maja problem z porcjowaniem danych, w tym artykule wyjaśnię jak tego dokonać zarówno przy korzystaniu z plików tekstowych jak i bazy danych.
Na początek zdefiniujmy sobie „bazy danych”, z których będziemy wybierać dane. Zacznijmy od bazy tekstowej, zapiszemy ją w pliku baza.txt
| 0|bialy 1|czarny 2|niebieski 3|zielony 4|czerwony 5|srebrny |
Teraz pora na prosta bazę danych w MySql, będzie ona zawierać tylko dwa pola, id i color.
| CREATE TABLE colors ( id INT(3) NOT NULL auto_increment, color VARCHAR(40), PRIMARY KEY (id) ); |
Zeby zapelnic nasza baze sql, napiszmy krotki skrypt w PHP.
| /*zakladam ze polaczenie z mysql zostlo juz nawiazane */ $kolory = array(’bialy’, 'czarny’, ‘niebieski’, ‘zielony’, ‘czerwony’, ‘srebrny’); foreach($kolory as $kolor) { mysql_query(„INSERT INTO colors VALUES(0, $kolor)”); } |
Dobrze mamy już nasze przykładowe dane, teraz przejdziemy do właściwej części artykułu, czyli porcjowania. Sam sposób postępowania w obydwu przypadkach jest podobny, przede wszystkim musimy wiedzie ile mamy rekordów w bazie, lub w przypadku pliku tekstowego, ile jest w nim linijek. Druga ważna informacja to ile rekordów powinno zostać wyświetlonych, ostatnia rzeczą która będzie nas interesować to na której stronie znajdujemy się teraz. O ilości rekordów decydujemy sami więc ustawmy sobie zmienną $naStronie równą 4. Natomiast numer strony będzie przekazywany metoda GET.
| $naStronie = 4; if($_GET[’strona’]) $strona = $_GET[’strona’]; else $strona = 0; |
Powyższy kod sprawdza czy zmienna $GET[’strona’] jest ustawiona, oraz czy jest większa lub równa zero. Brakuje nam jeszcze ilości rekordów w bazie, jednak sposób ustalenia tej wartości zależy od rodzaju wybranej bazy danych, a wiec w naszym sytuacji należy rozpatrzyć dwa przypadki (pliki .txt oraz baza MySql). Zacznijmy od plików tekstowych ze względu na to, ze początkujący programiści najczęściej o to pytają.
| $lines = file(’baza.txt’); $size = sizeof($lines); echo „Ilsosc rekordow w bazie $size, obecna strona $strona, ilosc stron „.ceil($size/$naStronie).”<br>”; for($i=$strona * $naStronie; $i<$strona*$naStronie+$naStronie && $i<$size; $i++) { $var = explode(„|”,$lines[$i]); echo $var[0].” — „.$var[1].”<br>”; } |
Pierwsza część kodu jest chyba oczywista, wczytujemy do zmiennej zawartość pliku. Pytania może budzić dopiero pętla for, a w zasadzie jej ‘dziwne’ warunki, a więc postaram się to szybko wyjaśnić, początkowa wartość $i jest równa linii, od której należy zacząć wyświetlanie wpisów ($strona*naStronie). Następnie znajdują się dwa warunki, pierwszy z nich mówi, że: $i ma być mniejsze niż początkowa wartość $i plus ilość wpisów na jednej stronie (($strona*$naStronie)+$naStronie), natomiast drugi warunek jest tylko zabezpieczeniem na wypadek gdyby $i przekroczyło rozmiar tablicy. Dalej już wszystko jest łatwe, dzielimy odpowiednią linie na tablice numeryczną i wyświetlamy odpowiednie wartości. Porcjowanie danych z bazy sql jest dużo prostsze, można nawet powiedzieć, ze opiera się o dwa zapytania, może najpierw zobaczmy na kod, a poniżej go omówię.
| //zakładamy ze jesteśmy połączeni z bazą danych $query = mysql_query(„SELECT count(*) FROM colors”); $row = mysql_fetch_array($query); $size = $row[’count(*)’]; echo „Ilsosc rekordow w bazie $size, obecna strona $strona, ilosc stron „.ceil($size/$naStronie).”<br>”; $start = $strona*$naStronie; $query = mysql_query(„SELECT * FROM colors LIMIT $start, $naStronie”); while($var = mysql_fetch_array($query)) { echo $var[0].” — „.$var[1].”<br>”; } |
Na samym początku sprawdzamy ile łącznie wierszy znajduje się ilość tabeli, wewnątrz zapytania zamiast nazw pól zostało użyte ‘dziwne’ słowo count(*) dzięki niemu możemy sprawdzić jaka jest łączna ilość rekordów objętych zapytaniem (to nam będzie potrzebne później) jak łatwo się domyślić ilość wierszy w bazie podzielona przez ilość wpisów na stronie da nam (po zaokrągleniu w gore) całkowitą ilość stron. Następne pytanie do bazy danych niewiele różni się od poprzedniego z tym, że count(*) zostało zastąpione przez ‘gwiazdkę’, (czyli wszystkie kolumny wewnątrz tabeli), oraz na końcu pojawiło się słowo LIMIT oraz dwie zmienne. Cały ten zapis jest odpowiedzialny za wyciągnięcie odpowiedniej ilości danych, przy czym $start oznacza wiersz od którego należy zacząć, a $naStronie ile wierszy ma być wyciągniętych. Zastosowana dalej pętla nie powinna budzić żadnych wątpliwości, są w niej w prosty sposób wyświetlane dane uzyskane w wyniku pierwszego zapytania. Na koniec zostało nam zrobić podział na strony, jest to element wspólny zarówno dla bazy tekstowej jak i bazy sql.
| if($strona!=0) echo ” <a href=?strona=”.($strona-1).”>poprzednia</a> „; for($i=0; $i<ceil($size/$naStronie); $i++) { if($strona==$i) echo ” [„.($i+1).”]”; else echo ” <a href=?strona=$i>[„.($i+1).”]</a> „; } if($strona<ceil($size/$naStronie)-1) echo ” &<a href=?strona=”.($strona+1).”&>nastepna&</a&> „; |
Pierwsza instrukcja if odpowiada za link do poprzedniej strony, jest on wyświetlany jeżeli obecna strona jest różna od zera. Zapis $i<ceil($size/$naStronie) wewnątrz pętli for oznacza, że pętla ta ma być wykonywana tak długo jak $i jest mniejsze niż ilość stron. Natomiast warunek w ostatnim if-ie, można przeczytać tak: „jeżeli obecna strona jest mniejsza niż ilość wszystkich stron minus jeden to wówczas istnieje strona następna”.
I to już wszystko, postępując analogicznie można porcjować dane z o wiele większych baz danych, nawet gdy informacje są wyciągane przy pomocy bardzo złożonych zapytań wykorzystujących pod zapytania lub łączenie tabel, należy pamiętać jedynie o tym, aby w przypadku bazy sql, odpowiednio zmienić pytanie dotyczące ilości wierszy.
