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 | 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łkowitegoINT
, 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:
Skrypt wstawiający rekord do bazy
Załóżmy, że chcemy wstawić do tabeli kolejny rekord reprezentujący aktora pochodzenia austriackiego – Arnolda Schwarzeneggera.
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:
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