|
Mysql |
|
|
|
|
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
|
|
|
|