W tej części kursu nauczysz się określać ilosc wybranych rekordów. Ograniczać ilość wybranych oraz porcjonować rekordy za pomocą poleceń SQL. Poznasz sposoby wyciągania danych o polach tabeli.
Podczas poprzedniej części naszego kursu nauczyliście się wybierać dokładniej interesujące nas rekordy (precyzowanie wielokrotnych warunków) - do tego przydałoby się jeszcze określenie ile wierszy zostało wybranych przez dane zapytanie. Możemy zliczać wybrane wiersze za pomocą funkcji PHP mysql_num_rows, która zwraca ilość wybranych wierszy za pomocą zapytania. Funkcję tą wykorzystujemy według następującego schematu:
$tresc_zapytania = "SELECT nazwa_pola FROM nazwa_tabeli WHERE warunek";
$zapytanie = mysql_query($tresc_zapytania);
$wiersze = mysql_num_rows($zapytanie);
Po wykonaniu powyższego kodu zmienna $wiersze będzie zawierała liczbę wybranych wierszy za pomocą zapytania. Teraz możesz wydrukować na górze strony ile razy znaleziono poszukiwane wyrażenie, a potem znalezione elementy. Na przykład:
$tresc_zapytania = "SELECT `nazwisko`, `lata` FROM `nba` WHERE `imie` LIKE
\"%a%\" ORDER BY DESC";
$zapytanie = mysql_query($tresc_zapytania);
$wiersze = mysql_num_rows($wykonaj);
if ($wiersze == 0)
print 'Nie znaleziono żadnego zawodnika z literą "a"
w imieniu';
else
print 'Znaleziono $znaleziono zawodników z literą "a"
w imieniu, oto oni:<br><br>';
while ($wiersz = mysql_fetch_row($zapytanie))
{
print 'Imie zwodnika: <strong>'.$wiersz[0].'</strong><br>Lata
gry: <strong>'.$wiersz[1].'</strong>";
}
Przy okazji pokazane jest jak sobie poradzić w przypadku, gdy nie znaleziono żadnych rekordów
Czasami chcemy w ramach statystyk wyświetlić np. tylko 10 pierwszy wierszy. Na przykład chcemy wyświetlić 10 zawodników, którzy zdobyli najwięcej punktów. Można to zrobić w sposób prosty: wybrać wszystkich zawodników malejąco według zdobytych punktów, podczas wyświetlania kolejnych wierszy odliczać a przy dziesiątym wierszu przerwać pętle odpowiadającą za wyświetlanie wierszy. Takie rozwiązanie na pierwszy rzut oka wydaje się odpowiednie jednak tak nie jest. Gdy wysyłamy zapytanie do bazy danych o wybranie zawodników malejąco według zdobytych punktów serwer MySQL musi wybrać wszystkie rekordy z tabeli! To jest trochę pracy ;) Musimy wysłać zapytaniem SQL informacje o tym, że interesuje nas tylko pierwszych dziesięć wierszy - zrobimy to za pomocą klauzuli LIMIT według schematu:
SELECT nazwa_pola FROM nazwa_tabeli LIMIT wartosc
Gdzie wartosc jest ilością pól, które chcemy wyświetlić. Oczywiście klauzulę LIMIT możemy mieszać razem z klauzulami WHERE i ORDER BY, przykład:
$tresc_zapytania = 'SELECT `nazwisko`, `punkty` FROM `nba` WHERE `lata`
> 5 ORDER BY `punkty` LIMIT 10';
$zapytanie = mysql_query($tresc_zapytania);
if (mysql_num_rows($zapytanie) > 0) {
while($wiersz = mysql_fetch_row($zapytanie)) {
echo 'Gracz '.$wiersz[0].' zdobył
'.$wiersz[1].' puntów(y).';
}
}
else
echo 'Nie znaleziono żadnych graczy.';
Powyższy kod wyświetli dziesięciu zawodników, którzy grają przynajmniej już 5 lat.
Często mamy od czynienia z sytuacją gdzie w tabeli znajduje się dużo danych - za dużo aby wyświetlić wszystkie na jednej stronie, wtedy musimy podzielić wyniki wyświetlania. Dzielimy wynik zapytania również za pomocą klauzuli LIMIT jednak w tym wypadku podajemy dwa argumenty wg schematu:
SELECT nazwa_pola FROM nazwa_tabeli LIMIT pozycja, ilosc
Pierwszy argument pozycja określa pozycje w zbiorze wyników zapytań. Drugi argument ilosc określa ilość wyświetlanych rekordów. Czyli jeśli jako pierwszy argument wstawimy 0 a jako drugi 10 to zapytanie zwróci dziesięć pierwszych rekordów, jeśli jako pierwszy argument podamy 10, a jako drugi 10 to zapytanie zwróci kolejne dziesięć wierszy itd. Kompletny przykład kodu PHP:
$strona = $_GET['s'];
// Wynikow Na Strone
$wns = 10;
settype($strona, "integer");
$tresc_zapytania_max = 'SELECT `id` FROM `nba`';
$zapytanie_max = mysql_query($tresc_zapytania_max);
// $r_max zawiera ilosc wszystkich rekordow w tabeli
$r_max = mysql_num_rows($zapytanie_max);
$tresc_zapytania = 'SELECT `nazwisko`, `punkty` FROM `nba` ORDER BY `nazwisko`
LIMIT '.($strona*$wns).','.$wns;
$zapytanie = mysql_query($tresc_zapytania);
while ($w = mysql_fetch_row($zapytanie)) {
}
$lStron = celi($r_max/$wns);
for ($i=0;$i<$pNum;$i++)
echo '<a href="strona.php?s='.$i.'">'.($i+1).'</a>';
Tak jak wcześniej pisałem po LIMIT podajemy dwa argumenty gdzie pierwszy
jest pozycją (w tym wypadku numerem strony) a drugi ilością pozycji wyświetlanych
na stronie. Zmienna $wns przechowuje liczbę określającą ilość rekordów
na stronie natomiast ciąg $strona*$wns oblicza pozycje wśród zbioru
rekordów od której chcemy odliczać $wns rekordów.
Zmienna $lStron przechowuje ogólną liczbę stron, która jest wyliczana
z zaokrąglenia w górę liczby rekordów w wybranym zbiorze przez liczbę rekordów
na stronę.
Pętla for ma za zadanie wyświetlić listę stron.
Jeśli mamy dostęp do jakiejś tabeli, którą nie my stworzyliśmy to zapewne chcemy cos o niej wiedzieć np. nazwy kolumn, jaka jest maksymalna długość znaków w danym polu etc. Nazwy pól możemy wydobyć za pomocą funkcji mysql_field_name wg schematu:
mysql_field_name(id_wyników, indeks_pola);
Rozpatrzmy to na przykładzie:
$tresc_zapytania = "SELECT * FROM nba LIMIT 1";
$zapytanie=mysql_query($tresc_zapytania);
$pole = mysql_field_name($zapytanie, 0);
Po wykonaniu tej operacji zmienna $pole będzie zawierała nazwę pierwszego
pola - oczywiście pola są indeksowane od zera. W tym przypadku zmienna zwróci
wartość "id" ponieważ takie jest pierwsze pole w tabeli nba.
Według tych samych zasad możemy wykorzystać inne funkcje wyciągające informacje
o polach:
mysql_field_len - zwraca długość pola
mysql_field_type - zwraca typ pola czyli np. int, real, string, blob czy inne typy pól MySQL.
mysql_field_flags - zwraca atrybuty takie pola jak not_null, primary_key, unique_key, multiple_key, blob, unsigned, zerofill, binary, enum, auto_increment czy timestamp
Piotr Kuźmiński, rok 2001, poprawiono: grudzień 2005
http://www.programista.biz
Znalazłeś błąd w tym kursie? Poinformuj mnie o tym.