Analiza skryptu wyszukującego dane
Podczas tych zajęć przeanalizujemy skrypt wyszukujący dane w tabeli ksiazki
, bazy danych ksiegarnia_internetowa
.
Sprawdzanie poprawności danych
-
$metoda = $_POST['metoda'];
- odebranie metody wybranej w formularzu. -
$wyrazenie = $_POST['wyrazenie'];
- odebranie szukanego wyrażenia wpisanego w formularzu. -
Jeżeli skrypt znajdowałby się w tym samym pliku co formularz, to należałoby sprawdzić, czy odświeżenie strony nastąpiło wskutek wysłania formularza np.
$wysłano = isset($_POST['metoda']) && $_POST['wyrazenie']);
. -
$wyrazenie = trim($wyrazenie);
- usunięcie znaków spacji, które użytkownik mógł wpisać przypadkowo na początku lub na końcu szukanego wyrażenia. Mogłoby się zdarzyć, że wyrażenie składało się z samych spacji. W takim wypadku funkcjatrim()
pozostawiłaby pusty ciąg znaków, równoważny logicznemufalse
. -
if (!$metoda || !$wyrazenie)
- jeżeli zmienna$metoda
jest pusta, lub zmienna$wyrazenie
jest pusta, to dajemy odpowiedni komunikat i za pomocąexit
kończymy działanie skryptu. Co prawda$metoda
musi przyjąć jakąś wartość z listy rozwijanej, niemniej lepiej sprawdzić obie wartości na wypadek, gdyby dane wysłane zostały przez kilka formularzy (może tak być, gdy baza danych jest udostępniona kilku serwisom). -
Sprawdzenie, czy dane wejściowe (do bazy) zawierają znaki kontrolne. Baza będzie błędnie interpretować znaki cudzysłowów pojedynczych i podwójnych oraz lewe ukośniki (\). Sposobem ucieczki od tych znaków jest poprzedzenie ich znakiem lewego ukośnika, tak więc np. znak
"
powinien być zapisany jako\"
, natomiast znak\
jako\\
. PHP posiada specjalne funkcje, utworzone specjalnie do ucieczki od znaków. Przed zapisem w bazie jakichkolwiek stringów, należy je przeformatować za pomocą funkcjiaddslashes()
. Zadanie odwrotne - usuwania ukośników po oczytaniu łańcucha z bazy danych wykonuje funkcjastripslashes()
. W nowszych wersjach PHP, włączony jest mechanizm automatycznego umieszczania i usuwania ukośników. Niemniej należy to sprawdzić za pomocąget_magic_quotes_gpc()
- jeżeli wynik jestfalse
, to zastosować funkcjeaddslashes()
orazstripslashes()
.
Połączenie z bazą danych
W PHP znajduje się biblioteka mysqli
, służąca do łączenia się z serwerem MySQL. Posiada ona interfejs zarówno proceduralny jak i obiektowy. W naszym przykładzie tworzymy obiekt $db
.
-
@ $db = new mysqli('localhost','admin','admin123','ksiegarnia_internetowa');
- uworzenie obiektu$db
klasymysqli
. Znak@
zapobiega komunikatom serwera (odpowiednio przyjazny sformułujemy za chwilę).localhost
- baza znajduje się na lokalnym serwerze (tam gdzie znajduje się skrypt PHP),admin
- użytkownik,admin123
- hasło użytkownika,ksiegarnia_internetowa
- baza danych, do której chcemy uzyskać połączenie. -
Funkcja
mysqli_connect_errno()
zwraca numer błędu (jak sama nazwa wskazuje), jeżeli taki wystąpi, lub zero jeżeli nastąpi połączenie. Wartość logiczna liczb różnych od zera wynositrue
, więc jeżeli tak jest, to mamy błąd, który obsłużymy własnym komunikatem i zakończymy działanie skryptu.
Wybór bazy
Co prawda w naszym skrypcie łączymy się od razu z bazą danych ksiegarnia_internetowa
. Jeżeli jednak, chcielibyśmy zmienić bazę danych, to powinniśmy zastosować metodę $db->select_db(nazwa_bazy);
.
Polskie litery
Obsługę polskich liter w nazwach oraz danych tabel zapewniają metody $db->query('SET NAMES utf8');
oraz $db->query('SET CHARACTER_SET utf8_unicode_ci');
.
Wysyłanie zapytania do bazy danych
-
$zapytanie = "select * from ksiazki where ".$metoda. " like '%".$wyrazenie."%'";
- treść zapytania sormułowana dokładnie tak jak to robiliśmy stosując SQL. Różnica jest taka, że zgodnie z konwencją PHP nie stosujemy wielkich liter, którymi pisaliśmy słowa kluczowe SQL. -
Wysłanie zapytania wykonuje metoda
$wynik = $db->query($zapytanie);
- jest zwracany obiekt wyników$wynik
, który posiada własne właściwości i metody potrzebne do analizy odczytanych danych.
Analiza wyniów zapytania
-
Wynikiem zapytania jest pewna liczba rekordów (wierszy) tabeli. Ich liczbę określa właściwość
$num_rows
, obiektu$wynik
, tak więc mamy$ile_znaleziono = $wynik->num_rows;
. -
Pętla
for ($i=0;$i<$ile_znaleziono;$i++)
obejmuje więc$ile_znaleziono
powtórzeń - od zera do$ile_znaleziono-1
. -
W każdym obiegu pętli stosujemy funkcję
fetch_assoc()
. -
$wiersz = $wynik->fetch_assoc();
- funkcjafetch_assoc()
zwraca tablicę asocjacyjną$wiersz
, której kluczami są nazwy pól wiersza, natomiast wartościami - wartości pól. Jeżeli chcielibyśmy otrzymać tablicę indeksowaną numerycznie, to powinniśmy zastosować$wiersz = $wynik->fetch_row();
Zamykanie połączenia z bazą danych
-
Pamięć zarezerwowaną na wynik połączenia zwalniamy poprzez
$wynik->free();
-
Zamknięcie połączenia jest realizowane za pomocą
$db->close();
. Użycie tej funkcji nie jest konieczne, połączenie i tak zostanie zamknięte, z chwilą zakończenia wykonywania skryptu.
Przykład odczytu danych z bazy metodą proceduralną
Odczyt danych z bazy w ujęciu proceduralnym jest analogiczny do metody obiektowej. Zamiast metod obiektów, stosujemy odpowiednie funkcje. Niemniej umieściłem prosty przykład - zobacz zadanie nr 6 w tabeli Zadania trochę trudniejsze. Zastosowanie tablic, definiowanie własnych funkcji, zapis/odczyt danych w plikach i w bazach danych. Zakładamy w przykładzie, że włączony jest mechanizm automatycznego umieszczania i usuwania ukośników.