Programowanie w Javie

advertisement
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).
Download