Przeczytaj
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 | |
2 | Jennifer | Lawrence | k | USA | |
3 | Penelope | Cruz | k | Hiszpania | |
4 | Sean | Connery | m | Szkocja | |
5 | Jodie | Foster | k | USA | |
6 | Christian | Bale | m | Wielka Brytania | |
7 | Natalie | Portman | k | USA | |
8 | Nicolas | Cage | m | USA |
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łkowitegoINT, autoinkrementowany),atrybuty typu
TINYTEXT:imie,nazwisko,plec(płeć),kraj_ur(kraj urodzenia),atrybut typu
DATEo nazwie:data_ur(data urodzenia).
Archiwum ZIP potrzebne do wykonania zadań w tym e‑materiale znajdziesz poniżej:
Skrypt wstawiający rekord do bazy
Załóżmy, że chcemy wstawić do tabeli kolejny rekord reprezentujący aktora pochodzenia austriackiego – Arnolda Schwarzeneggera.

Film dostępny pod adresem /preview/resource/R1EvZXVdYtn5c
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:
Dla przypomnienia, w liniach o kolejnych numerach zrealizowano:
Akt nawiązania połączenia z bazą danych lub w razie niepowodzenia wyświetlenie komunikatu o błędzie i wstrzymanie dalszego wykonania skryptu.
Przypisanie do obsługi komunikacji zestawu znaków UTF‑8, zawierającego polskie znaki diakrytyczne.
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.
Rzeczywiste wykonanie kwerendy umieszczonej uprzednio w zmiennej
$q, za pośrednictwem połączenia o identyfikatorze$c.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 fetchowaniemfetchowaniem.
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:
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:

Film dostępny pod adresem /preview/resource/ROEHvl7RpjJn8
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:
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ękonkatenację ł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 fetchfetch, 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:
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:
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.
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
operacja wyjmowania wartości pojedynczych rekordów z całej przesłanej odpowiedzi bazy danych na zapytanie wyszukujące SELECT
proces łączenia (sklejania ze sobą) dwóch lub więcej ciągów znaków