Kurs MySQL w PHP, część 3 poprawiona

Czego się nauczysz w tej części kursu

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.

Mała rzecz, a cieszy

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

Ograniczenie wyników zapytania

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.

Porcjowanie wyników zapytania

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.

Informacje o tabeli

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

Informacje o autorze

Piotr Kuźmiński, rok 2001, poprawiono: grudzień 2005
http://www.programista.biz
Znalazłeś błąd w tym kursie? Poinformuj mnie o tym.