Aplikacje WWW - laboratorium



Podobne dokumenty
Aplikacje WWW - laboratorium

Bazy danych i usługi sieciowe

Aplikacje WWW - laboratorium

Aplikacje WWW - laboratorium

Bazy Danych i Usługi Sieciowe

Bazy danych i usługi sieciowe

Aplikacje internetowe - laboratorium

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Wykład 5: PHP: praca z bazą danych MySQL

Laboratorium 1 Wprowadzenie do PHP

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Widok Connections po utworzeniu połączenia. Obszar roboczy

Baza danych do przechowywania użytkowników

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

Wydział Elektrotechniki, Informatyki i Telekomunikacji Instytut Informatyki i Elektroniki

Aplikacje WWW - laboratorium

Aplikacje WWW - laboratorium PHP + bazy danych

Bazy Danych - Instrukcja do Ćwiczenia laboratoryjnego nr 8

INSTALACJA I KONFIGURACJA SERWERA PHP.

Internetowe bazy danych

Wykład 6: PHP: praca z bazą danych MySQL, cz.2

Plan bazy: Kod zakładający bazę danych: DROP TABLE noclegi CASCADE; CREATE TABLE noclegi( id_noclegu SERIAL NOT NULL,

Spis treści. Wstęp 5 Rozdział 1. Praca z AJAX-em 9. Rozdział 2. Współpraca ze skryptami PHP 55. Rozdział 3. Obsługa formularzy 81

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Projektowanie aplikacji w modelu MVC opartej o framework CodeIgniter

Podstawy programowania (PHP/Java)

Sprzeg podstawowy do baz danych w PHP Mateusz Sowa, 2007

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Język SQL, zajęcia nr 1

Bazy danych. Wykład IV SQL - wprowadzenie. Copyrights by Arkadiusz Rzucidło 1

Aplikacje internetowe

Bazy danych. dr inż. Arkadiusz Mirakowski

Sprawdzenie czy połączenie przebiegło poprawnie if (mysqli_connect_errno()) { echo Błąd; Połączenie z bazą danych nie powiodło się.

Wdrożenie modułu płatności eservice. dla systemu Gekosale 1.4

Bazy danych. dr Radosław Matusik. radmat

1. Połączenie z bazą danych. W wybranym edytorze tworzymy plik sqltest.py i umieszczamy w nim poniższy kod. #!/usr/bin/python3 import sqlite3

Aplikacje WWW - laboratorium

Instalacja MySQL.

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

Założenia do ćwiczeń: SQL Server UWM Express Edition: \SQLEXPRESS. Zapoznaj się ze sposobami użycia narzędzia T SQL z wiersza poleceń.

ZAAWANSOWANE BAZY DANYCH I HURTOWNIE DANYCH MySQL, PHP

Obiektowe bazy danych Ćwiczenia laboratoryjne (?)

Bazy danych. Polecenia SQL

Język PHP. Studium Podyplomowe Sieci Komputerowe i Aplikacje Internetowe. v1.7, 2007/11/23

Systemy internetowe. Wykład 4 mysql. West Pomeranian University of Technology, Szczecin; Faculty of Computer Science

Laboratorium nr 4. Temat: SQL część II. Polecenia DML

Database Connectivity

Bazy danych wykład dwunasty PL/SQL, c.d. Konrad Zdanowski ( Uniwersytet Kardynała Stefana Bazy danych Wyszyńskiego, wykładwarszawa)

SQL 4 Structured Query Lenguage

Język SQL. Rozdział 8. Język manipulowania danymi DML

SIECI KOMPUTEROWE I BAZY DANYCH

System. Instalacja bazy danych MySQL. Autor : Piotr Zielonka tel Piotrków Tryb., sierpień 2018r.

Wykład 05 Bazy danych

Wykład 5. SQL praca z tabelami 2

Zajęcia 13 wykorzystanie MySQL w PHP cz. 2

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

PHP + MySQL w laboratorium (1)

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

Żeby korzystać z opisywanego modułu, należy go włączyć do kompilowanej wersji interpretatora PHP:

Wykład 6. SQL praca z tabelami 3

Projekt-bazy danych Poczta

Ćwiczenie 4. Użytkownicy

Język SQL. Rozdział 8. Język manipulowania danymi DML zadania

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Autor: Joanna Karwowska

SSK - Techniki Internetowe

BAZA DANYCH SIECI HOTELI

Zajęcia 11 wykorzystanie MySQL w PHP

Ćwiczenie 2. Opcja przestrzenna bazy danych

Hurtownia Świętego Mikołaja projekt bazy danych

KOLEKCJE - to typy masowe,zawierające pewną liczbę jednorodnych elementów

SIECI KOMPUTEROWE I BAZY DANYCH

DECLARE VARIABLE zmienna1 typ danych; BEGIN

MVC w praktyce tworzymy system artykułów. cz. 2

Podstawy technologii WWW

Projektowanie systemów baz danych

Podstawowe wykorzystanie Hibernate

Pracownia internetowa w szkole ZASTOSOWANIA

Wdrożenie modułu płatności eservice. dla systemu Magento

Zaawansowane aplikacje internetowe

PODSTAWY BAZ DANYCH 13. PL/SQL

Aplikacje WWW - laboratorium

Laboratorium 3. Odkrywanie reguł asocjacyjnych.

XML-owe bazy danych ćwiczenia 1

Bazy Danych. Ćwiczenie 1: Przygotowanie środowiska pracy dla bazy MySQL z wykorzystaniem XAMPP Portable Lite oraz MySQL-Front

Obiektowe bazy danych

Laboratorium 6 Tworzenie bloga w Zend Framework

Paweł Cieśla. Dokumentacja projektu

Wdrożenie modułu płatności eservice. dla systemu oscommerce 2.3.x

Wprowadzenie do Doctrine ORM

Podstawy programowania III WYKŁAD 2

ACESS- zadania z wykorzystaniem poleceń SQL

Pakiety podprogramów Dynamiczny SQL

Bazy danych 10. SQL Widoki

Język PL/SQL. Rozdział 5. Pakiety podprogramów. Dynamiczny SQL

Język PL/SQL Procedury i funkcje składowane

Transkrypt:

Aplikacje WWW - laboratorium PHP + bazy danych Celem ćwiczenia jest przygotowanie prostej aplikacji internetowej wykorzystującej technologię PHP. Ćwiczenie prezentuje podstawowe aspekty poprawnego programowania aplikacji internetowej wykorzystującej bazę danych (wiązanie zmiennych, ochrona przed włamaniem typu SQL injection, rozróżnienie między metodami GET i POST, ochrona przed wielokrotnym zgłoszeniem tego samego formularza). Ćwiczenie można wykonać na dowolnym komputerze, którym zainstalowano serwer HTTP (np. Apache) z obsługą PHP oraz bazę danych MySQL. Rozwiązania ćwiczeń omawianych w poniższym zestawie zostały przygotowane z wykorzystaniem pakietu XAMPP (wersja 1.6.6.a, dostępnego pod adresem: http://www.apachefriends.org/en/xampp.html), który jest zestawem programów pozwalających na szybkie rozpoczęcie pracy z skryptami PHP. W skład pakietu wchodzą, między innymi, następujące, wstępnie skonfigurowane narzędzia: Apache, PHP, MySQL, FileZilla, Perl, OpenSSL, MercuryMail, Webalizer i inne. 1. Pierwszym krokiem ćwiczenia będzie ilustracja znaczenia wiązania zmiennych przy zapytaniach do bazy danych. Połącz się z instancją isqlplus i zaloguj na swoje konto w bazie danych Oracle. Następnie, uruchom poniższe skrypty i przeanalizuj czas ich działania. SET TIMING ON DECLARE l_sql VARCHAR(100) := 'SELECT COUNT(*) FROM obj WHERE object_id = '; l_cnt NUMBER := 0; BEGIN FOR i IN 1..1000 LOOP EXECUTE IMMEDIATE l_sql i INTO l_cnt; END LOOP; END; SET TIMING ON DECLARE l_sql VARCHAR(100) := 'SELECT COUNT(*) FROM obj WHERE object_id = :id'; l_cnt NUMBER := 0; BEGIN FOR i IN 1..1000 LOOP EXECUTE IMMEDIATE l_sql INTO l_cnt USING i; END LOOP; END;

2. Uruchom panel kontrolny pakietu XAMPP i uruchom serwery Apache i MySQL. 3. Otwórz w przeglądarce adres http://localhost/phpmyadmin/ i utwórz nową bazę danych o nazwie instytut. 4. Utwórz tabelę ETATY o strukturze KOLUMNA TYP WŁAŚCIWOŚCI NAZWA VARCHAR(10) PRIMARY KEY PLACA_OD DECIMAL(6,2) NULL PLACA_DO DECIMAL(6,2) NULL 5. Po utworzeniu tabeli kliknij na zakładkę Import w pasku narzędziowym. Utwórz plik o nazwie etaty.sql i wypełnij go poniższą zawartością. Następnie, wykorzystaj formularz do importowania danych aby załadować zawartość pliku do tabeli ETATY. Upewnij się, że jako format importowanego pliku zaznaczono SQL. INSERT INTO `etaty` (`NAZWA`, `PLACA_OD`, `PLACA_DO`) VALUES ('PROFESOR', 3000.00, 4000.00), ('ADIUNKT', 2510.00, 3000.00), ('ASYSTENT', 1500.00, 2100.00), ('DOKTORANT', 800.00, 1000.00), ('SEKRETARKA', 1470.00, 1650.00), ('DYREKTOR', 4280.00, 5100.00);

6. Po załadowaniu danych kliknij na zakładkę Browse i sprawdź, czy dane zostały poprawnie załadowane do tabeli ETATY. 7. Analogicznie, utwórz tabelę ZESPOLY o strukturze jak poniżej. KOLUMNA TYP WŁAŚCIWOŚCI ID_ZESP SMALLINT(6) PRIMARY KEY NAZWA VARCHAR(20) NULL ADRES VARCHAR(50) NULL 8. Utwórz plik zespoly.sql, wypełnij go poniższą zawartością i załaduj zawartość pliku do tabeli ZESPOLY. INSERT INTO `zespoly` (`ID_ZESP`, `NAZWA`, `ADRES`) VALUES (10, 'ADMINISTRACJA', 'PIOTROWO 2'), (20, 'SYSTEMY ROZPROSZONE', 'PIOTROWO 3A'), (30, 'SYSTEMY EKSPERCKIE', 'STRZELECKA 14'), (40, 'ALGORYTMY', 'WIENIAWSKIEGO 16'), (50, 'BADANIA OPERACYJNE', 'MIELZYNSKIEGO 30');

9. Kliknij na zakładkę SQL w panelu nawigacyjnym i umieść w oknie następujące polecenie: DROP TABLE IF EXISTS `pracownicy`; CREATE TABLE `pracownicy` ( `ID_PRAC` SMALLINT(6), `NAZWISKO` VARCHAR(30) NOT NULL, `IMIE` VARCHAR(15) NULL, `ETAT` VARCHAR(10) NULL, `ID_SZEFA` SMALLINT(6), `ZATRUDNIONY` DATE DEFAULT NULL, `PLACA_POD` DECIMAL(6,2) DEFAULT NULL, `PLACA_DOD` DECIMAL(6,2) DEFAULT NULL, `ID_ZESP` SMALLINT(6) DEFAULT NULL, PRIMARY KEY (ID_PRAC), FOREIGN KEY (ID_SZEFA) REFERENCES pracownicy(id_prac), FOREIGN KEY (ID_ZESP) REFERENCES zespoly(id_zesp) ) TYPE=MyISAM; a następnie wypełnij tabelę PRACOWNICY poniższymi danymi: INSERT INTO `pracownicy` VALUES (100, 'Marecki', 'Jan', 'DYREKTOR', NULL, '1968-01-01', 4730.00, 980.50, 10), (110, 'Janicki', 'Karol', 'PROFESOR', 100, '1973-05-01', 3350.00, 610.00, 40), (120, 'Nowicki', 'Pawel', 'PROFESOR', 100, '1977-09-01', 3070.00, NULL, 30), (130, 'Nowak', 'Piotr', 'PROFESOR', 100, '1968-07-01', 3960.00, NULL, 20), (140, 'Kowalski', 'Adam', 'PROFESOR', 130, '1975-09-15', 3230.00, 805.00, 20), (150, 'Grzybowska', 'Maria', 'ADIUNKT', 130, '1977-09-01', 2845.50, NULL, 20), (160, 'Krakowska', 'Anna', 'SEKRETARKA', 130, '1985-03-01', 1590.00, NULL, 20), (170, 'Opolski', 'Roman', 'ASYSTENT', 130, '1992-10-01', 1839.70, 480.50, 20), (190, 'Kotarski', 'Konrad', 'ASYSTENT', 140, '1993-09-01', 1971.00, NULL, 20), (180, 'Makowski', 'Marek', 'ADIUNKT', 100, '1985-02-20', 2610.20, NULL, 10), (200, 'Przywarek', 'Leon', 'DOKTORANT', 140, '1994-07-15', 900.00, NULL, 30), (210, 'Kotlarczyk', 'Jan', 'DOKTORANT', 130, '1993-10-15', 900.00, 570.60, 30), (220, 'Siekierski', 'Jacek', 'ASYSTENT', 110, '1993-10-01', 1889.00, NULL, 20), (230, 'Dolny', 'Tomasz', 'ASYSTENT', 120, '1992-09-01', 1850.00, 390.00, NULL); 10. Kliknij na odnośnik Server: localhost u góry ekranu aby powrócić do głównego ekranu programu phpmyadmin. Kliknij na odnośnik Privileges. Kliknij na odnośnik Add a new user i utwórz lokalnego użytkownika SCOTT z hasłem TIGER. Zwróć uwagę, aby użytkownik był lokalny. Nie generuj nowej bazy danych dla użytkownika i nie nadawaj użytkownikowi żadnych przywilejów globalnych.

11. Kliknij na odnośnik Serwer: localhost w górnym panelu nawigacyjnym, a następnie przejdź do zakładki Privileges. Kliknij na ikonę edycji przywilejów przy użytkowniku SCOTT. Znajdź grupę przywilejów specyficznych dla danej bazy danych i z listy rozwijanej wybierz bazę danych instytut. 12. Kliknij odnośnik Check All aby nadać użytkownikowi SCOTT wszystkie przywileje do bazy danych instytut i kliknij przycisk go. 13. Pierwszy skrypt nawiąże połączenie z bazą danych i wyświetli podstawowe informacje o serwerze bazy danych. Utwórz plik file01.php i umieść w nim poniższy kod. $link = mysqli_connect("localhost", "scott", "tiger", "instytut"); if (!$link) printf("connect failed: %s\n", mysqli_connect_error()); exit(); printf("<h1>host information</h1>"); printf("<ul>"); printf("<li>server information: %s</li>", mysqli_get_server_info($link)); printf("<li>character version: %s</li>", mysqli_character_set_name($link)); printf("<li>host information: %s</li>", mysqli_get_host_info($link)); printf("</ul"); mysqli_close($link);

14. Drugi skrypt obrazuje sposób wydania najprostszego zapytania do bazy danych i wyświetlenia wyniku. Utwórz plik file02.php i umieść w nim poniższy kod. $link = mysqli_connect("localhost", "scott", "tiger", "instytut"); if (!$link) printf("connect failed: %s\n", mysqli_connect_error()); exit(); $result = mysqli_query($link,"select * FROM zespoly"); if (!$result) printf("query failed: %s\n", mysqli_error($link)); printf("<h1>zespoly</h1>"); printf("<table border=\"1\">"); $fields = mysqli_fetch_fields($result); printf("<tr><th>%s</th><th>%s</th><th>%s</th></tr>", $fields[0]->name,$fields[1]->name,$fields[2]->name); while ($row = mysqli_fetch_array($result)) printf("<tr><td>%s</td><td>%s</td><td>%s</td></tr>",$row[0],$row[1],$row[2]); printf("</table>"); printf("<i>query returned %d rows </i>", mysqli_num_rows($result)); mysqli_free_result($result); mysqli_close($link); 15. Kolejny skrypt pokazuje, w jaki sposób odczytać wynik zapytania w postaci tablicy asocjacyjnej. Utwórz plik file03.php i umieść w nim poniższy kod. Zwróć uwagę na różnice między kodem z pliku file03.php i pliku file02.php dotyczące sposobu pobrania wiersza z wyniku. $link = mysqli_connect("localhost", "scott", "tiger", "instytut"); if (!$link) printf("connect failed: %s\n", mysqli_connect_error()); exit(); $result = mysqli_query($link,"select * FROM etaty ORDER BY placa_od"); if (!$result) printf("query failed: %s\n", mysqli_error($link)); printf("<h1>etaty</h1>"); printf("<table border=\"1\">"); printf("<tr><th>nazwa</th><th>placa_od</th><th>placa_do</th></tr>"); while ($row = mysqli_fetch_assoc($result)) printf("<tr><td>%s</td><td>%6.2f</td><td>%6.2f</td></tr>", $row["nazwa"],$row["placa_od"],$row["placa_do"]);

printf("</table>"); printf("<i>query returned %d rows </i>", mysqli_num_rows($result)); mysqli_free_result($result); mysqli_close($link); 16. Interfejs MySQLi dostarcza także trzeciego sposobu odczytywania wierszy wyniku. Utwórz plik file04.php, umieść w nim poniższy kod i porównaj ten kod z poprzednimi dwoma rozwiązaniami. $link = mysqli_connect("localhost", "scott", "tiger", "instytut"); if (!$link) printf("connect failed: %s\n", mysqli_connect_error()); exit(); $result = mysqli_query($link,"select * FROM pracownicy"); if (!$result) printf("query failed: %s\n", mysqli_error($link)); printf("<h1>pracownicy</h1>"); printf("<table border=\"1\">"); printf("<tr><th>id_prac</th><th>nazwisko</th><th>etat</th><th>zatr.</th></tr>"); while ($obj = mysqli_fetch_object($result)) printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>", $obj->id_prac, $obj->nazwisko, $obj->etat, $obj->zatrudniony); printf("</table>"); printf("<i>query returned %d rows </i>", mysqli_num_rows($result)); mysqli_free_result($result); mysqli_close($link);

17. Jak już wcześniej powiedzieliśmy, wiązanie zmiennych przy zapytaniach do bazy danych ma kolosalne znaczenie: pozwala uniknąć ataków typu SQL Injection oraz umożliwia optymalizatorowi zapytań efektywne wykorzystanie skompilowanych planów wykonania zapytania. Utwórz plik file05.php i umieść w nim poniższy kod, prześledź bardzo uważnie procedurę przygotowywania i wykonywania zapytania wykorzystującego zmienne wiązane. $link = mysqli_connect("localhost", "scott", "tiger", "instytut"); if (!$link) printf("connect failed: %s\n", mysql_connect_error()); exit(); printf("<h1>pracownicy</h1>"); $psql = "SELECT nazwisko, etat FROM pracownicy WHERE id_prac =?"; $pstmt = mysqli_stmt_init($link); mysqli_stmt_prepare($pstmt, $psql); for ($i=100;$i<230;$i+=10) mysqli_stmt_bind_param($pstmt,"i",$i); mysqli_stmt_execute($pstmt); mysqli_stmt_bind_result($pstmt,$nazwisko,$etat); mysqli_stmt_fetch($pstmt); printf("$nazwisko pracuje jako $etat <br/>"); mysqli_stmt_close($pstmt); mysqli_close($link);

18. Język PHP oferuje wiele różnych uniwersalnych interfejsów do baz danych: Pear::MDB2, PHP Data Objects (PDO), PHP ODBC, PHP ADOdb, i inne. W poniższym ćwiczeniu przyjrzymy się jednemu z interfejsów, Pear::MDB2. Uruchom konsolę MS-DOS i upewnij się, czy moduł MDB2 został zainstalowany. W tym celu przejdź do katalogu $XAMPP_HOME/php i wydaj komendę C:\> pear list 19. Utwórz plik file07.php i umieść w nim poniższy kod. Zaobserwuj różnice między interfejsem Pear::MDB2 i MySQLi. require_once('mdb2.php'); $dsn = "mysql://scott:tiger@localhost/instytut"; $db = MDB2::connect($dsn); if (MDB2::isError($db)) die($db->getmessage()); printf("<h1>pracownicy</h1>"); printf("<table border=\"1\">"); printf("<tr><th>id</th><th>nazwisko</th><th>etat</th><th>placa</th></tr>"); $sql = "SELECT id_prac,nazwisko,etat,placa_pod FROM pracownicy"; $result = $db->query($sql); while ($row = $result->fetchrow(mdb2_fetchmode_ordered)) printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%6.2f</td></tr>", $row[0],$row[1],$row[2],$row[3]); printf("</table>"); $result->free(); $sql = "SELECT COUNT(*) FROM pracownicy"; $result = $db->queryone($sql); echo "<i>query returned $result rows</i>"; $db->disconnect();

20. Podobnie jak MySQLi, Pear::MDB2 oferuje dostęp do wyników zapytania zarówno przez zwykłą tablicę, jak i tablicę asocjacyjną oraz dostęp obiektowy. Zmodyfikuj kod w skrypcie file07.php poprzez zmianę pętli pobierającej wynik zapytania na poniższy kod. while ($row = $result->fetchrow(mdb2_fetchmode_assoc)) printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%6.2f</td></tr>", $row["id_prac"],$row["nazwisko"],$row["etat"],$row["placa_pod"]); 21. Następnie, przetestuj dostęp obiektowy do wyników zapytania. while ($row = $result->fetchrow(mdb2_fetchmode_object)) printf("<tr><td>%d</td><td>%s</td><td>%s</td><td>%6.2f</td></tr>", $row->id_prac,$row->nazwisko,$row->etat,$row->placa_pod);

22. Ostatni przykład obrazuje fundamentalny wzorzec postępowania z aplikacjami internetowymi, POST REDIRECT GET. Utwórz skrypt file08.php i umieść w nim poniższy kod. Przetestuj aplikację. Jakie dostrzegasz błędy i wady tego rozwiązania? require_once('mdb2.php'); $dsn = "mysql://scott:tiger@localhost/instytut"; $db = MDB2::connect($dsn); if (MDB2::isError($db)) die($db->getmessage()); print<<<koniec <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> </head> <body> <form action="file08.php" method="post"> id_prac <input type="text" name="id_prac"> nazwisko <input type="text" name="nazwisko"> <input type="submit" value="wstaw"> <input type="reset" value="wyczysc"> </form> KONIEC; if (isset($_post['id_prac']) && is_numeric($_post['id_prac']) && is_string($_post['nazwisko'])) $sql = "INSERT INTO pracownicy(id_prac,nazwisko) VALUES(?,?)"; $pstmt = $db->prepare($sql); $result =& $pstmt->execute(array($_post['id_prac'],$_post['nazwisko'])); if (MDB2::isError($result)) die($result->getmessage()); $sql = "SELECT * FROM pracownicy"; $result = $db->query($sql); while ($row = $result->fetchrow()) echo "$row[0],$row[1] <br/>"; $result->free(); $db->disconnect(); 23. Spróbuj wprowadzić niepoprawne dane (np. zduplikuj wartość klucza podstawowego). Nawiguj między kolejnymi stronami za pomocą przycisków przeglądarki, odśwież zawartość okna w przeglądarce.

24. Utwórz skrypt file08.form.php i umieść w nim poniższy kod. print<<<koniec <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> </head> <body> <form action="file08.post.php" method="post"> id_prac <input type="text" name="id_prac"> nazwisko <input type="text" name="nazwisko"> <input type="submit" value="wstaw"> <input type="reset" value="wyczysc"> </form> </body> </html> KONIEC; 25. Utwórz skrypt file08.post.php i umieść w nim poniższy kod. require_once('mdb2.php'); $dsn = "mysql://scott:tiger@localhost/instytut"; $db = MDB2::connect($dsn); if (MDB2::isError($db)) die($db->getmessage()); if (isset($_post['id_prac']) && is_numeric($_post['id_prac']) && is_string($_post['nazwisko'])) $sql = "INSERT INTO pracownicy(id_prac,nazwisko) VALUES(?,?)"; $pstmt = $db->prepare($sql); $result =& $pstmt->execute(array($_post['id_prac'],$_post['nazwisko'])); if (MDB2::isError($result)) echo "<a href=\"file08.get.php\">back to the list of employees</a><br/>"; die($result->getmessage()); $db->disconnect(); header('location: file08.get.php');

26. W ostatnim kroku utwórz skrypt file08.get.php i umieść w nim poniższy kod. require_once('mdb2.php'); include('file08.form.php'); $dsn = "mysql://scott:tiger@localhost/instytut"; $db = MDB2::connect($dsn); if (MDB2::isError($db)) die($db->getmessage()); $sql = "SELECT * FROM pracownicy"; $result = $db->query($sql); while ($row = $result->fetchrow()) echo "$row[0],$row[1] <br/>"; $result->free(); $db->disconnect(); 27. Zapoznaj się z artykułem http://www.theserverside.com/tt/articles/article.tss?l=redirectafterpost