Wykład 5: PHP: praca z bazą danych MySQL Architektura WWW Podstawowa: dwuwarstwowa - klient (przeglądarka) i serwer WWW Rozszerzona: trzywarstwowa - klient (przeglądarka), serwer WWW, serwer bazy danych czyli warstwa klienta, warstwa aplikacji, warstwa danych Przykład działania: • Po stronie klienta: wyświetla się formularz do wyszukania słów • Na serwerze WWW: skrypt np. php, aby połączyć się z bazą danych i wygenerować kod HTML z wynikiem wyszukiwania (lista książek danego autora), który zwróci baza danych. Kod HTML zostanie wysłany do klienta jako odpowiedź serwera WWW • Na serwerze bazy danych: tabela np. dwie kolumny: autor i tytuł książki Aplikacja WWW - aplikacja działająca na serwerze WWW, a użytkownik obsługuje ją w przeglądarce (interfejs tej aplikacji jest obsługiwany przez przeglądarkę). Dynamiczny dokument napisany w PHP jest przykładem takiej aplikacji (aplikacja może składać się z wielu dokumentów). Baza danych MySQL Uruchomienie serwera bazy danych MySQL przez Control Panel XAMPP: nacisnąć "Start" dla serwisu (modułu) MySQL Bazą danych MySQL można zarządzać przez aplikację WWW phpMyAdmin, Uruchomienie phpMyAdmin przez Control Panel XAMPP: nacisnąć "Admin" dla serwisu MySQL W bazie danych zakładamy (jak to zrobić, patrz następny slajd): • konto użytkownika z hasłem • bazę dla tego użytkownika • nadajemy mu pełne uprawnienia na tą bazę Po zainstalowaniu pakietu XAMPP, dostęp do bazy danych jako root domyślnie nie jest chroniony hasłem (hasło jest puste). Więc włączając phpMyAdmin od razu uzyskujemy dostęp do baz danych. Na swoim serwerze należy to zmienić, ale w 405 i 407 NIE Ustawienie hasła dla root-a w MySQL: W Control Panel XAMPP nacisnąć "Admin" dla serwisu Apache. Dalej "Security" i następnie kliknąć w http://localhost/security/xamppsecurity.php Baza danych MySQL - utworzenie konta użytkownika i bazy przez phpMyAdmin W phpMyAdmin: Użytkownicy - Dodaj użytkownika Nazwa użytkownika: wybrać "użyj pola tekstowego" i w polu obok wpisać nazwę np. nasze inicjały: mg Host: wybrać host lokalny (localhost). Pole obok wypełni się automatycznie jako localhost Wpisać i powtórzyć hasło W części "Baza danych dla użytkownika" zaznaczyć pole: "Utwórz bazę danych z taką samą nazwą i przyznaj wszystkie uprawnienia." Na dole strony nacisnąć "Wykonaj" Po wykonaniu powyższych czynności zostanie utworzone konto użytkownika i jednocześnie baza danych o tej samej nazwie co użytkownik. Użytkownik będzie miał pełny dostęp do tej bazy danych. Np. jeśli nazwa użytkownika: "mg" to baza danych też ma nazwę "mg" Połączenie z bazą danych Przykład: polaczenie.php • adres serwera bazy danych: localhost • login: mg1 • hasło: abc • nazwa bazy: mg1 gdzie mg to nazwa jaką nadaliśmy przy zakładaniu konta (zobacz poprzedni slajd) Użyte funkcje: mysqli_connect() - otwiera połączenie z bazą danych, argumenty zgodne z tym co powyżej czyli adres serwera, login, hasło i nazwa bazy mysqli_connect_errno() - zwraca opis błędu, gdy połączenie się nie powiedzie, zwraca NULL gdy się powiedzie exit() - to samo co die() mysqli_close() - zamyka połączenie połączenie z bazą danych Zazwyczaj serwer www i serwer bazy danych jest uruchomiony na tym samym hoście, więc pierwszym argument mysqli_connect będzie localhost (czyli ten sam host co serwer www). Ale może być sytuacja, że serwer b.d. będzie uruchomiony na innym hoście, wtedy pierwszy argument mysqli_connect to adres tego serwerato a nie localhost . Utworzenie tabeli w bazie W phpMyAdmin można tworzyć tabele w trybie wizualnym lub przez uruchomienie zapytania SQL Utwórzmy tabelę z trzema kolumnami (atrybutami) do zapisywania zamówień na kawę id imie kawy Utworzenie w trybie wizualnym: • Wybrać z lewej strony bazę • W części "Utwórz tabelę" wpisać nazwę tabeli np. zamowienia i dalej nacisnąć "Wykonaj" • Podać informacje o trzech kolumnach tabeli: Kolumna I: nazwa: id typ: INT A_I: zahaczykować (auto increment) - automatyczne nadawanie numeru dla rekordu, jednocześnie ta kolumna będzie automatycznie kluczem głównym Kolumna II: nazwa: imie typ: VARCHAR Długość: 50 Kolumna III: nazwa: kawy typ: INT • Na dole po prawej nacisnąć "Zapisz" Utworzenie tabeli w bazie Utworzenie poprzez uruchomienie zapytanie SQL: • Wybrać z lewej strony bazę • Z górnego menu wybrać "SQL" • Wprowadzić poniższe zapytanie: CREATE TABLE zamowienia ( id INT PRIMARY KEY AUTO_INCREMENT, imie VARCHAR(50) NOT NULL, kawy INT NOT NULL ); • Na dole po prawej nacisnąć "Wykonaj" Wstawienie danych do tabeli (INSERT) Przykład: wstawienie.php Na stronie jest formularz do zamówienia kawy. Zamawiający podaje swoje imię i ile kaw zamawia. Zamówienie zapisywane jest w bazie danych w tabeli zamówienia Użyte funkcje: mysqli_query() - wykonuje zapytanie SQL podane jako drugi argument (pierwszy argument to zmienna połączenia) • jeśli zapytanie się nie wykona zwraca FALSE • jeśli zapytanie się wykona: w przypadku zapytań SELECT, SHOW, DESCRIBE zwraca obiekt mysqli_result będący wynikiem zapytania w przypadku pozostałych zapytań zwraca TRUE Zapytanie SQL podane jako argument dla mysqli_query nie wymaga średnika na końcu: $sql = "INSERT INTO zamowienia ... ;"; // średnik czerwony jest niepotrzebny mysqli_error() - zwraca opis ostatniego błędu, w naszym przykładzie informacja dlaczego rekord nie został wstawiony, przydatna funkcja, aby uzyskać informacje o wszelkich błędach Funkcją mysqli_query() można wykonać dowolne zapytanie SQL, wstawiając je jako drugi argument. Odczyt danych z tabeli (SELECT) Przykład: odczyt.php mysqli_num_rows() - zwraca ile wyników zapytania (ile rekordów/krotek/wierszy). mysqli_fetch_array() - zwraca tablicę reprezentującą rekord. Elementy tej tablicy to wartości kolejnych atrybutów (kolumn) danego rekordu. Dwie możliwości. Zmienna $res to zmienna, której wartością jest wynik zapytania: 1. mysqli_fetch_array($res) zwróci tablicę indeksowaną numerycznie 2. mysqli_fetch_array($res, MYSQLI_ASSOC) zwróci tablicę asocjacyjną indeksowaną nazwami atrybutów (kolumn) Kolejne rekordy spośród wyników zapytania odczytujemy w pętli while. mysqli_fetch_array() zwróci wartość null jeśli zostaną odczytane wszystkie rekordy. Wtedy pętla zostanie przerwana. mysqli_free_result() - zwalnia pamięć zajmowaną przez wynik zapytania. Usuwanie danych z tabeli (DELETE) - cz. 1 Przykłady, dwa sposoby: Sposób I: usuwanie.php - użyto metody GET, usunięcie przez kliknięcie w link Sposób polega na tym, że przy każdym rekordzie (zamówieniu) dodajemy link z URL z parametrem "usun", aby wiedzieć, że ma być przeprowadzona operacja usuwania. Wartością parametru usun jest id rekordu, który ma być usunięty. Instrukcja if sprawdza czy było żądanie z parametrem usun w adresie URL, jeśli tak wykonuje zapytanie usuwające rekord o podanym id Uwaga: Tworząc link "Usuń" musimy chronić cudzysłów: Błąd podwójny cudzysłów: echo "<a href="jakis_adres">...</a>"; Poprawnie: echo "<a href=\"jakis_adres\">...</a>"; //chronimy backslashem wewnętrzny cudzysłów Poprawnie, ale nieczytelnie i łatwo się pomylić: echo "<a href=" . ' " ' . "jakisadres" . ' ">...</a>" '; Usuwanie danych z tabeli (DELETE) - cz. 2 Sposób II: usuwaniePOST.php - użyto metody POST, usunięcie przez kliknięcie przycisku formularza Sposób polega na tym, że przy każdym rekordzie dodajemy formularz z przyciskiem "Usuń" typu submit i ukrytym polem z wartością będącą id rekordu, który ma być usunięty. Dzięki temu polu będziemy wiedzieli, że użytkownik nacisnął przycisk "Usuń" i który rekord usunąć. W formularzach ustawiamy metodę wysłanie na "post". Drugi sposób jest analogiczny z pierwszym. Różnica polega na tym, że inaczej są przekazywane parametry usunięcia: Sposób I: jako część adresu URL, Sposób II: w ciele żądania. Ale jeśli ustawimy w formularzu metodę GET a nie POST, usunięcie będzie "realizowane" metodą GET Modyfikacja danych (UPDATE) Przykład: modyfikacja.php - modyfikacja przez kliknięcie w link Kroki do wykonania: 1. dodajemy link z URL z parametrem "zmien" z wartością będącą id rekordu, który będziemy modyfikować. 2. instrukcja warunkowa sprawdza czy było żądanie modyfikacji (czy był kliknięty link). Jeśli tak: 2a. odczytujemy z bazy rekord, który ma być zmodyfikowany po "id" przekazanym w p. 1 2b. wyświetlamy formularz z polami tekstowymi do których wpisujemy aktualne wartości rekordu (wartości wszystkich atrybutów z wyjątkiem atrybutu "id". Atrybutu "id" nie będzie można zmieniać). 2c. w tym formularzu tworzymy przycisk "Zapisz zmianę". Naciśnięcie będzie oznaczało, że należy wykonać modyfikację (wykonać zapytanie SQL modyfikujące rekord) 2d. w tym formularzu tworzymy pole ukryte: "zapisz" z wartością będącą id rekordu, który trzeba zmodyfikować. Dzięki temu będziemy wiedzieli, że trzeba zmodyfikować rekord i który . 3. instrukcja warunkowa sprawdza czy wykonać modyfikację (czy był naciśnięty przycisk "Zapisz zmianę"). Jeśli tak to wykonujemy modyfikację, a dane do modyfikacji odczytujemy z formularza. Link "Zmień", zmienna "zmien" - użytkownik zgłasza chęć wykonania modyfikacji (użyto GET) Przycisk "Zapisz zmianę", zmienna "zapisz" - zapisanie zmian w bazie (użyto POST) Inne operacje w bazie Inne operacje np. CREATE analogicznie: • • Tworzymy zapytanie SQL i podajemy je jako argument funkcji mysqli_query() funkcją mysqli_error() możemy sprawdzić czy były błędy Przykład z poleceniem "create" i "drop" zobacz plik sql.php Ponad 100 funkcji w PHP do obsługi bazy danych: http://www.php.net/mysqli Dane konfiguracji połączenia z bazą w oddzielnym pliku Mamy 4 skrypty PHP wykonujące następujące operacje: zapis, odczyt, usuwanie i modyfikację. W każdym z tych skryptów są dane konfiguracji połączenia z bazą danych. Problem: Jeśli zmieni się hasło, nazwa użytkownika itp. będziemy musieli robić zmiany w każdym z tych skryptów czyli 4 razy . Rozwiązanie: Dane konfiguracji połączenia z bazą danych należy zapisać w oddzielnym pliku i dołączyć go do tych czterech. Gdy zmieni się np. hasło zmianę musimy zrobić tylko w jednym pliku czyli 1 raz. 1. Zatem tworzymy plik o nazwie np. config.php i tam wpisujemy dane konfiguracji połączenia z bazą danych. Przykład: config.php 2. Ten plik dołączamy do tych 4 skryptów funkcją require (więcej o require na innym wykładzie). Przykład dla odczytu: odczyt_require.php (linia 10-11). Analogicznie możemy zrobić dla pozostałych plików (wstawienie.php, usuwanie.php, modyfikacja.php).