POWRÓT NA STRONĘ SZKOŁY

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 funkcja trim() pozostawiłaby pusty ciąg znaków, równoważny logicznemu false.
  • 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ą funkcji addslashes(). Zadanie odwrotne - usuwania ukośników po oczytaniu łańcucha z bazy danych wykonuje funkcja stripslashes(). 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 jest false, to zastosować funkcje addslashes() oraz stripslashes().

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 klasy mysqli. 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 wynosi true, 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(); - funkcja fetch_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.