Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Przeanalizujmy następującą tabelę znajdującą się w bazie danych MySQL:

id

imie

nazwisko

plec

kraj_ur

data_ur

1

Tom

Hanks

m

USA

1956‑08‑09

2

Jennifer

Lawrence

k

USA

1990‑08‑15

3

Penelope

Cruz

k

Hiszpania

1974‑04‑28

4

Sean

Connery

m

Szkocja

1930‑08‑25

5

Jodie

Foster

k

USA

1962‑10‑19

6

Christian

Bale

m

Wielka Brytania

1974‑01‑30

7

Natalie

Portman

k

USA

1981‑06‑09

8

Nicolas

Cage

m

USA

1964‑01‑07

Tabela nosi nazwę aktorzy i przechowuje (na potrzeby serwisu recenzującego w internecie filmy) informacje na temat znanych aktorów hollywoodzkich. Cała baza danych nosi nazwę filmoteka. Tabela zawiera kolejno:

  • klucz główny id (typu całkowitego INT, autoinkrementowany),

  • atrybuty typu TINYTEXT: imie, nazwisko, plec (płeć), kraj_ur (kraj urodzenia),

  • atrybut typu DATE o nazwie: data_ur (data urodzenia).

Archiwum ZIP potrzebne do wykonania zadań w tym e‑materiale znajdziesz poniżej:

RaLpsJJHUNAQQ

Przycisk do pobrania pliku ZIP z bazą danych.

Plik ZIP o rozmiarze 2.16 KB w języku polskim

Skrypt wstawiający rekord do bazy

Załóżmy, że chcemy wstawić do tabeli kolejny rekord reprezentujący aktora pochodzenia austriackiego – Arnolda Schwarzeneggera.

R1EvZXVdYtn5c1
Film‑samouczek: Współpraca bazy danych ze stroną internetową, etap drugi, część pierwsza.

Skrypt PHP realizujący zadanie dopisania do tabeli kolejnego rekordu prezentuje się następująco:

Linia 1. $c znak równości mysqli podkreślnik connect otwórz nawias okrągły cudzysłów localhost cudzysłów przecinek cudzysłów root cudzysłów przecinek cudzysłów cudzysłów przecinek cudzysłów filmoteka cudzysłów zamknij nawias okrągły or die otwórz nawias okrągły cudzysłów Problem z serwerem wykrzyknik cudzysłów zamknij nawias okrągły średnik. Linia 2. mysqli podkreślnik set podkreślnik charset otwórz nawias okrągły $c przecinek cudzysłów utf8 cudzysłów zamknij nawias okrągły średnik. Linia 3. $q znak równości cudzysłów INSERT INTO aktorzy VALUES otwórz nawias okrągły NULL przecinek apostrof Arnold apostrof przecinek apostrof Schwarzenegger apostrof przecinek apostrof m apostrof przecinek apostrof Austria apostrof przecinek apostrof 1947 minus 07 minus 30 apostrof zamknij nawias okrągły cudzysłów średnik. Linia 4. mysqli podkreślnik query otwórz nawias okrągły $c przecinek $q zamknij nawias okrągły średnik. Linia 5. mysqli podkreślnik close otwórz nawias okrągły $c zamknij nawias okrągły średnik.

Dla przypomnienia, w liniach o kolejnych numerach zrealizowano:

  1. Akt nawiązania połączenia z bazą danych lub w razie niepowodzenia wyświetlenie komunikatu o błędzie i wstrzymanie dalszego wykonania skryptu.

  2. Przypisanie do obsługi komunikacji zestawu znaków UTF‑8, zawierającego polskie znaki diakrytyczne.

  3. Zapisanie treści zapytania SQL w specjalnie utworzonej zmiennej PHP – całe zapytanie umieszczono w cudzysłowie, zaś łańcuchy wewnątrz zapytania zamknięto w apostrofach.

  4. Rzeczywiste wykonanie kwerendy umieszczonej uprzednio w zmiennej $q, za pośrednictwem połączenia o identyfikatorze $c.

  5. Zamknięcie aktywnego połączenia o identyfikatorze $c.

Okazuje się, że wykonanie kwerendy INSERT, UPDATE lub DELETE na bazie danych, jest zadaniem stosunkowo trywialnym. Wystarczyło bowiem przygotować treść kwerendy w pomocniczej zmiennej $q, po czym rzeczywiście wykonać ją funkcją mysqli_query(),używając otwartego połączenia o identyfikatorze $c.

Raport wyszukujący informacje w bazie

Jednak zadanie to staje się trudniejsze, jeżeli chcemy wyszukać informacje, czyli wykonać zapytanie SELECT. Baza danych musi wówczas także odpowiedzieć na kwerendę – zwracając do skryptu PHP mnóstwo wyszukanych (zgodnie z podanymi kryteriami) informacji. Proces przetwarzania takiej odpowiedzi określamy w nomenklaturze bazodanowej fetchowaniemfetchowaniefetchowaniem.

Ciekawostka

Angielskie słówko fetch oznacza: sprowadzić, przynieść, wydobyć. Doskonale oddaje to naturę procesu wyjmowania pojedynczych rekordów z całej przesłanej odpowiedzi bazy danych na zapytanie wyszukujące SELECT.

Załóżmy, że mamy wyszukać w tabeli aktorzy informacje o aktorach (imię, nazwisko, płeć) urodzonych w Stanach Zjednoczonych. Wykonanie takiej kwerendy wyszukującej będzie zatem wymagało przechowania odpowiedzi bazy danych w dodatkowej, pomocniczej zmiennej PHP:

Linia 1. $q znak równości cudzysłów SELECT imie przecinek nazwisko przecinek plec FROM aktorzy WHERE kraj podkreślnik ur znak równości apostrof USA apostrof cudzysłów średnik. Linia 2. $result znak równości mysqli podkreślnik query otwórz nawias okrągły $c przecinek $q zamknij nawias okrągły or die otwórz nawias okrągły cudzysłów Problem z kwerendą wykrzyknik cudzysłów zamknij nawias okrągły średnik.

Odpowiedź bazy na zapytanie zapisane w zmiennej $q zostanie umieszczona w pojemniku o nazwie $result. Dodatkowo, z użyciem znanej nam klauzuli or die() przerwiemy dalsze przetwarzanie skryptu, jeśli wystąpi problem z wykonaniem kwerendy. Opisane przekształcenie skryptu PHP w raport prześledźmy dokładnie w filmie samouczku:

ROEHvl7RpjJn81
Film‑samouczek: Współpraca bazy danych ze stroną internetową, etap drugi, część druga.

Zawartość zmiennej $result nie jest pojedynczą wartością jakiegokolwiek atrybutu. Jest to obiekt klasy mysqli_result, który jednak możesz roboczo traktować jako dwuwymiarową tablicę (tabelę złożoną z wierszy i kolumn) składająca się z pięciu wyjętych rekordów (aktorów), z których każdy posiada po trzy atrybuty (imię, nazwisko, płeć):

imie

nazwisko

plec

Tom

Hanks

m

Jennifer

Lawrence

k

Jodie

Foster

k

Natalie

Portman

k

Nicolas

Cage

m

Zatem odpowiedź na zapytanie stanowi cały zestaw danych, który należy przetworzyć (pociąć na pojedyncze wartości). W praktyce oznacza to najczęściej skonstruowanie pętli wykonującej się – jak to mówimy – „dopóki istnieją rekordy”, zaś wewnątrz niej, w ramach każdej iteracji należy:

  • wyciąć z całej dwuwymiarowej tablicy bieżący rekord (wiersz),

  • z tego rekordu wypisać wartości poszczególnych atrybutów (kolumn).

Pętla, wypisująca rekord po rekordzie, cały zestaw zwróconych w $result prezentuje się następująco:

Linia 1. while otwórz nawias okrągły $row znak równości mysqli podkreślnik fetch podkreślnik assoc otwórz nawias okrągły $result zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. echo $row otwórz nawias kwadratowy apostrof imie apostrof zamknij nawias kwadratowy kropka cudzysłów cudzysłów kropka $row otwórz nawias kwadratowy apostrof nazwisko apostrof zamknij nawias kwadratowy kropka cudzysłów cudzysłów kropka $row otwórz nawias kwadratowy apostrof plec apostrof zamknij nawias kwadratowy kropka cudzysłów otwórz nawias ostrokątny br zamknij nawias ostrokątny cudzysłów średnik. Linia 3. zamknij nawias klamrowy.

Pomocnicza zmienna $row (ang. row = wiersz) zawiera zawsze jeden rekord wyjęty ze wszystkich wierszy zwróconych przez kwerendę (czyli jest to tablica już tylko jednowymiarowa). Oczywiście to wyjmowanie do $row musi być realizowane w pętli, gdyż rekordów przesłanych w wyniku zapytania może być dużo. W przykładzie wybrano sterowaną warunkiem pętlę while, gdyż automatycznie przerwie ona działanie, gdy wszystkie rekordy zostaną wypisane.

Natomiast do poszczególnych wartości pól w rekordzie dostajemy się, podając indeks w tablicy – inny dla każdej szufladki. W metodzie mysqli_fetch_assoc() indeksy są asocjacyjne, czyli skojarzeniowe. Jest to słowna reprezentacja, będąca po prostu nazwą kolumny występującej w bazie danych.

Operator kropki: . oznacza w PHP tzw. konkatenacjękonkatenacjakonkatenację łańcuchów, która umożliwia wplecenie wartości zmiennych PHP prosto w generowany wynikowy kod źródłowy HTML.

Trzy sposoby przetwarzania danych

W języku PHP wyróżniamy trzy podstawowe odmiany operacji fetchfetchowaniefetch, realizującej wkładanie pojedynczych rekordów do pomocniczej tablicy jednowymiarowej $row:

  • mysqli_fetch_row()przetwarzanie liczbowe – ponumeruj (od zera) szufladki tablicy jednowymiarowej;

  • mysqli_fetch_assoc()wyjmowanie asocjacyjne (skojarzeniowe) – ponazywaj słownie szufladki tablicy jednowymiarowej, nadając im zawsze taki sam identyfikator, jaki posiadają kolumny w bazie danych;

  • mysqli_fetch_array()przetwarzanie równocześnie numeryczne i asocjacyjne (dostępne są oba rodzaje indeksów); wadą tej metody jest redundancja (powtarzanie) danych.

W zależności od wyboru metody przetwarzania, nieco inny wygląd przyjmie pętla wypisująca wartości odczytanych pól. W poprzednim przykładzie, w którym użyto funkcji mysqli_fetch_assoc(), indeksy tablicy były słowne. Natomiast w przypadku użycia metody mysqli_fetch_row() kolumny indeksujemy numerycznie:

Linia 1. while otwórz nawias okrągły $row znak równości mysqli podkreślnik fetch podkreślnik assoc otwórz nawias okrągły $result zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. echo $row otwórz nawias kwadratowy 0 zamknij nawias kwadratowy kropka cudzysłów cudzysłów kropka $row otwórz nawias kwadratowy 1 zamknij nawias kwadratowy kropka cudzysłów cudzysłów kropka $row otwórz nawias kwadratowy 2 zamknij nawias kwadratowy kropka cudzysłów otwórz nawias ostrokątny br zamknij nawias ostrokątny cudzysłów średnik. Linia 3. zamknij nawias klamrowy.

Wynik wypisania wartości w przeglądarce jest identyczny jak ostatnio, zmieniły się jedynie indeksy tablicy jednowymiarowej $row – zamiast wartości słownych, zastosowano teraz kolejne liczby (inkrementowane od zera). Ostateczny wybór metody przetwarzania rezultatu zależy najczęściej tylko od osobistej preferencji programisty. Indeksy numeryczne łatwiej można przetwarzać w pętlach, zaś słowne szybciej pozwalają zorientować się, co dokładnie w sposób iteracyjny wypisujemy.

Pobranie liczby zwróconych rekordów

Dzięki zastosowaniu funkcji o nazwie mysqli_num_rows() istnieje dodatkowa możliwość odczytania liczby rekordów zwróconych przez zapytanie SELECT:

Linia 1. $q znak równości cudzysłów SELECT imie przecinek nazwisko przecinek plec FROM aktorzy WHERE kraj podkreślnik ur znak równości apostrof USA apostrof cudzysłów średnik. Linia 2. $result znak równości mysqli podkreślnik query otwórz nawias okrągły $c przecinek $q zamknij nawias okrągły or die otwórz nawias okrągły cudzysłów Problem z kwerendą wykrzyknik cudzysłów zamknij nawias okrągły średnik. Linia 4. $ile znak równości mysqli podkreślnik num podkreślnik rows otwórz nawias okrągły $result zamknij nawias okrągły średnik. Linia 5. echo cudzysłów Liczba aktorów amerykańskich w bazie dwukropek cudzysłów kropka $ile średnik.

Jedynym argumentem funkcji zastosowanej w linii czwartej jest identyfikator zmiennej, w której umieszczono wyniki zapytania SELECT – w naszym przykładzie jest to $result. W pomocniczej zmiennej $ile znajdzie się zatem liczba zwróconych tym zapytaniem rekordów.

Ciekawostka

Należy bezwzględnie pamiętać, aby funkcję mysqli_num_rows() umiejscowić w kodzie pod wywołaniem metody mysqli_query(), nigdy powyżej, tak aby zmienna $result przechowywała już w sobie zwrócony wynik zapytania.

Słownik

fetchowanie
fetchowanie

operacja wyjmowania wartości pojedynczych rekordów z całej przesłanej odpowiedzi bazy danych na zapytanie wyszukujące SELECT

konkatenacja
konkatenacja

proces łączenia (sklejania ze sobą) dwóch lub więcej ciągów znaków