php 2 - SKiBD
Transkrypt
php 2 - SKiBD
Akademia Górniczo-Hutnicza Wydział Inżynierii Mechanicznej i Robotyki Katedra Robotyki i Dynamiki Maszyn SIECI KOMPUTEROWE I BAZY DANYCH ĆWICZENIE NR 9 Temat: OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. SKiBD Laboratorium 8 CEL ĆWICZENIA: Nabycie umiejętności tworzenia i wykorzystywania formularzy do komunikacji z bazą danych, poznanie funkcji obsługującej pocztę elektroniczną oraz tworzenie własnych funkcji i obiektów. 1. CZĘŚĆ TEORETYCZNA Do olbrzymich zalet języka PHP należy zaliczyć bogatą bibliotekę wbudowanych funkcji służących szeroko rozumianej komunikacji. Najważniejszymi z tych funkcji są funkcje umożliwiające wysyłanie wiadomości e-mail prosto z serwera oraz funkcje realizujące komunikację z różnymi bazami danych. Pisanie własnych funkcji jest również bardzo proste. Aby jednak mieć, co wysyłać pocztą lub wpisywać do bazy danych konieczne jest z reguły przygotowanie odpowiedniego formularza HTML oraz pobranie z niego danych. a) Formularze PHP w sposób bardzo prosty i niemalże intuicyjny pozwala na przechwycenie danych z formularza i przygotowanie ich do dalszego przetwarzania. Poniżej przedstawione zostaną sposoby pobrania danych z formularza. Formularz HTML powinien zawierać następujące elementy: - metodę - akcję - przycisk submit (wyślij) Kliknięcie przycisku wysyłającego dane (submit) w formularzu HTML powoduje wysłanie zmiennych do skryptu określonego przez ACTION poprzez określoną metodę METHOD. Są dwie metody POST i GET. Zmienne przesyłane z formularza do skryptu PHP są umieszczane w globalnej tablicy asocjacyjnej $_POST lub $_GET w zależności od metody formularza i są automatycznie udostępniane skryptowi. Wysłanie formularza powoduje utworzenie w wykonywanym skrypcie zmiennych według prostego schematu: nazwa obiektu formularza -> nazwa zmiennej PHP Formularz <INPUT type=”text” name=”nazwisko” > skrypt PHP $nazwisko – zmienna Warto zauważyć, że proces tworzenia zmiennych jest niejako automatyczny. Wynika z niego jednak wniosek podobny do tego, który sformułowaliśmy przy definiowaniu zmiennych, to znaczy należy zwracać szczególną uwagę przy nazywaniu pól formularza. Czytelne nazewnictwo może bardzo ułatwić analizę kodu. Poniżej zaprezentowany zostanie przykład wykorzystania formularza HTML jako formularza obliczeniowego. OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 2 SKiBD Laboratorium 8 przykład 1. (skrypt wielokrokowy) <?php $phase = $_POST['phase']; $val1 = $_POST['val1']; $val2 = $_POST['val2']; $calc = $_POST['calc']; if(!isset($phase)) $phase=""; $msg=""; switch($phase) { case 'two': if( ($val1 =="") || ($val2 == "") || ($calc == "") ) { header("Location: http://localhost/skbd/labPHP2/calculate.php"); exit; } switch($calc) { case 'add': $msg ="Wynikiem dodawania $val1 + $val2 jest <STRONG><FONT color=\"red\"> "; $result = $val1 + $val2; $msg.="$result"; break; case 'sub': $msg ="Wynikiem odejmowania $val1 - $val2 jest <STRONG><FONT color=\"red\">"; $result = $val1 - $val2; $msg.="$result"; break; case 'mult': $msg ="Wynikiem mnozenia $val1 * $val2 jest <STRONG><FONT color=\"red\">"; $result = $val1 * $val2; $msg.="$result"; break; case 'div': $msg ="Wynikiem dzielenia $val1 / $val2 jest <STRONG><FONT color=\"red\">"; $result = $val1 / $val2; $msg.="$result"; break; } $msg.="</FONT></STRONG>"; break; default: $msg.="<form method=\"post\" <p> Wartość 1: <input <p> Wartość 2: <input <p>Działanie:<br> <input type=\"radio\" action=\"$PHP_SELF\"> type=\"text\" name=\"val1\" size=10> type=\"text\" name=\"val2\" size=10> name=\"calc\" value=\"add\" checked> dodawanie <br> <input type=\"radio\" name=\"calc\" value=\"sub\"> odejmowanie <br> <input type=\"radio\" name=\"calc\" value=\"mult\"> mnozenie <br> <input type=\"radio\" name=\"calc\" value=\"div\"> dzielenie <br> <p> <input type=\"submit\" name=\"submit\" value=\"oblicz\"> <input type=\"hidden\" name=\"phase\" value=\"two\"> </form>"; break; OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 3 SKiBD Laboratorium 8 } ?> <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <TITLE> Kalkulator </TITLE> </HEAD> <BODY> <? echo "$msg"; ?> </BODY> </HTML> Powyższy fragment kodu wymaga komentarza. Znalazły się w nim nowe elementy takie jak funkcja header, lecz również zmienna $PHP_SELF, buforowanie kodu w zmiennej $msg, oraz wykorzystanie ukrytych zmiennych na formularzu. Wszystkie te elementy pozwalają zawrzeć w jednym pliku wielokrokowy interfejs tworzony interaktywnie w zależności od działania użytkownika. Funkcja header jest wykorzystywana w celu ponownego przekierowania na początek skryptu wtedy, gdy użytkownik wybierze „oblicz” bez podania liczb, na których maja zostać wykonane obliczenia. Zmienna $PHP_SELF jest zmienną o specjalnym znaczeniu, przechowuje ona adres bieżącego skryptu i umożliwia wysłanie zmiennych formularza ponownie do tego samego skryptu. Aby jednak nie wracać wciąż w to samo miejsce w formularzu zdefiniowano niewidoczne (hidden) pole tekstowe o nazwie phase i wartości ‘two’, które powala na rozróżnienie w instrukcji switch etapu przetwarzania danych i właściwe sformatowanie treści wpisywanej do zmiennej $msg. Na końcu pozostaje tylko w treści strony wypisać zawartość zmiennej $msg (w tym przypadku jest to np. cały formularz lub wynik obliczeń). Oczywiście jako parametr ACTION można podać inny skrypt php, jednak rozwiązanie wykorzystujące jeden skrypt jest bardziej zwięzłe i pozwala na łatwe wykonanie prostego „kreataora” www. W miarę wzrostu umiejętności pisania skryptów możemy je rozszerzać o własne funkcje dokonujące sprawdzania poprawności danych jak również wysyłających odpowiednie komunikaty o błędach. Jest to konieczne, jeśli zamierzamy dane z formularza kierować do bazy danych. b) Wysyłanie listów elektronicznych (e-mail) Jednym z najczęściej spotykanych zastosowań formularzy są ankiety i zamówienia, które przesyła się na adres e-mail. PHP pozwala bardzo wygodnie przygotować informację zawartą w formularzu i wysłać ją bezpośrednio za pomocą serwera. Do wysłania wiadomości służy jedna funkcja mail. Poniżej znajduje się przykład skryptu wysyłającego wiadomość e-mail w formacie html. Takie rozwiązanie jest obecnie bardzo popularne, bo pozwala wykorzystać wszystkie formatowania tekstu, jakie wykorzystujemy na naszej stronie. przykład 2. (obsługa poczty elektronicznej, czysty tekst ) <html> <body> <? $msg=" Dzien dobry piszę do Ciebie ... "; $to = "[email protected]"; $subject = "Moj pierwszy mail."; OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 4 SKiBD Laboratorium 8 $mailheaders = "From: moja strona <> \n"; $mailheaders .= "Odpowiedz: [email protected]\n"; $mailheaders .= "Content-Type: text; charset=utf-8\n"; mail($to,$subject,$msg,$mailheaders); echo "wysłano e-mail na adres: $to<p>"; ?> </body> </html> przykład 3. (obsługa poczty elektronicznej, format html ) <html> <body> <? $msg=" <html> <head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"> </head> <body background=\"yellow\" leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\"> To jest wadomość. </body> </html> "; $to = "[email protected]"; $subject = "Moj pierwszy mail html"; $mailheaders = "From: moja strona <> \n"; $mailheaders .= "Reply-To : [email protected] \n"; $mailheaders .= "Content-Type: text/html; charset=UTF-8\n"; mail($to,$subject,$msg,$mailheaders); echo "wysłano e-mail na adres: $to<p>"; ?> </body> </html> c) Pisanie własnych funkcji Do tego momentu korzystaliśmy przeważnie z wbudowanych funkcji PHP. Pisanie własnych funkcji jest jednak łatwe. Funkcje definiowane przez użytkownika są niezwykle ważnym elementem optymalizacji kodu. Pisząc swoje skrypty w pewnym momencie na pewno zauważysz, że pewne jego części są powtarzane. Możesz to właśnie wyeliminować poprzez zdefiniowanie funkcji, która będzie realizowała to zadanie. W PHP funkcje muszą być zadeklarowane przed ich użyciem. Funkcje mogą przyjmować argumenty (domyślnie argumenty są przekazywane przez wartość) lub mogą nie przyjmować żadnych argumentów. Funkcja również może zwracać jakąś wartość lub nie. <?php function suma($a, $b){ $c = $a + $b; return $c; OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 5 SKiBD Laboratorium 8 } echo suma(5,5); ?> Nasza funkcja suma jak widać przyjmuje dwa argumenty. W ciele funkcji sumuje wartości tych argumentów i wynik zwraca dzięki instrukcji return. Następnie wywołujemy tą funkcję i podajemy jako argument funkcji echo. Powinniśmy zobaczyć w oknie przeglądarki wynik. W ciele funkcji możemy również wywoływać inne funkcje. <?php function napis(){ echo "Dziś mamy ".gmdate("d m Y"); } napis(); ?> Mamy tu przykład wywołania funkcji w ciele funkcji przez nas definiowanej. Jednocześnie jest to funkcja, która nie przyjmuje żadnych argumentów i żadnych wartości nie zwraca. Jej zadaniem jest wyświetlenie napisu informującego, jaki mamy dzień. Jeszcze mała uwaga na temat organizacji kodu. Definicje swoich funkcji najlepiej umieszczać w innym pliku, np. lib.inc.php a następnie dołączać go do plików, w jakich zamierzamy używać zdefiniowanych przez nas funkcji poprzez wyrażenie include. plik lib.inc.php: <?php function napis(){ echo "Dziś mamy ".gmdate("d m Y"); } ?> plik index.php: <? include("lib.inc.php"); //Wyrażenie dołącza plik. Jeśli nie znajduje się on w tym samym katalogu pamiętaj aby podać jako argument całą ścieżkę do pliku. napis(); ?> PHP jest językiem obiektowym (w każdym razie na tyle na ile to jest możliwe). Oznacza to, że możemy dokonywać opisu rzeczywistości operując obiektami. Pod pojęciem obiektu rozumiemy zbiór danych oraz funkcji operujących na tych danych obudowanych w jedną strukturę. PHP daje nam możliwość zdefiniowania klas obiektów z wykorzystaniem słowa class a następnie wykorzystywania wielu obiektów danej klasy z wykorzystaniem polecenia new . Poniższy przykład pokazuje ideę wykorzystania obiektów. przykład 4. (korzystanie z obiektów) <?php class Koszyk { var $zakupy; // Zakupy w naszym koszyku // Dodaj $num artykułów typu $artnr do wózka OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 6 SKiBD Laboratorium 8 function dodaj_produkt ($artnr, $num) { $this->zakupy[$artnr] += $num; } // Usuń $num artykułów typu $artnr z wózka function usun_produkt ($artnr, $num) { if ($this->zakupy[$artnr] > $num) { $this->zakupy[$artnr] -= $num; return true; } else { return false; } } } ?> <?php $koszyk = new Koszyk; $koszyk->dodaj_produkt("10", 1); $inny_koszyk = new Koszyk; $inny_koszyk->dodaj_produkt("0815", 3); ?> Pisanie kodu z wykorzystaniem obiektów umożliwia zmniejszenie jego ilości, uzyskanie większej przejrzystości, dużo łatwiejsze nim zarządzanie oraz zapewnienie większego bezpieczeństwa danych poprzez ukrycie zmiennych lokalnych. d) Obsługa bazy danych na przykładzie bazy MySql Bazy danych MySQL są jednymi z najpopularniejszych wśród programistów PHP. Baza ta nadzwyczajnie dobrze spisuje się w wielu sytuacjach. Istnieje wiele dobrze opisanych funkcji PHP, które możesz użyć w połączeniu ze swoimi bazami MySQL. Jednak, aby połączyć się z bazą danych i pobrać z niej dane, będziesz potrzebował tylko kilku z tych funkcji: mysql_connect - otwiera połączenie z serwerem MySQL; wymaga nazwy hosta, użytkownika i hasła. mysql_db_select - wybiera bazę na serwerze MySQL. mysql_query - wykonuje zapytanie SQL. mysql_fetch_array - pobiera wiersz z wyniku zapytania SQL i umieszcza go w tablicy. mysql_free_result - zwalnia zasoby używane w bieżącym połączeniu. mysql_close - zamyka bieżące połączenie. Aby zapoznać się z resztą funkcji PHP do obsługi baz MySQL, zajrzyj do Manuala PHP ! Przyjmijmy, że mamy zainstalowanego MySQLa na systemie, i mamy poprawnego użytkownika oraz hasło dla istniejącej bazy. Przyjmijmy także, że mamy już stworzoną tablicę w bazie, o nazwie LISTA_PRZEDMIOTOW. Tablica LISTA_PRZEDMIOTOW posiada trzy kolumny: NAZWA_PRZEDMIOTU, TYP_ZAJEC i EGZAMIN. Rekordy w tablicy LISTA_PRZEDMIOTOW zapełniamy przykładowo takimi danymi: OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 7 SKiBD Laboratorium 8 matematyka,wykład,tak fizyka,wykład,nie fizyka,laboratorium,nie itd… Następnie zacznijmy tworzyć kod PHP, który tworzy zmienną połączenia: <? $connection = mysql_connect("localhost","username","password") or die("Niemożliwe połączenie z bazą danych!"); Przetestuj czy połączenie zostało uzyskane, a jeżeli nie zostało to wyświetl komunikat o błędzie i zakończ działanie skryptu: Jeżeli przebrnąłeś przez test połączenia, następnym krokiem będzie wybranie bazy i stworzenie zapytania SQL. Przyjmując, że tablica LISTA_PRZEDMIOTOW istnieje w bazie danych MySQL pod nazwą "sXXXX". Najpierw stwórzmy zmienną bazy: $db = mysql_select_db("sXXXX", $connection)or die("Niemożliwe pobranie bazy!"); Następnie przetestuj czy baza została wybrana, jeżeli nie została to wyświetl komunikat o błędzie i zakończ działanie skryptu: Do tego punktu, PHP łączy się z serwerem i wybiera bazę danych. Jeżeli zrobiłeś już tak dużo, to możesz bez problemu stworzyć zapytanie SQL i uzyskać wynik! Używając tablicy LISTA_PRZEDMIOTOW, przypuśćmy, że chcemy wyświetlić zasoby, zawierające nazwę przedmiotu oraz typ zajęć, które kończą się egzaminem. Stwórz zmienną przechowującą zapytanie SQL: $sql = "SELECT NAZWA_PRZEDMIOTU, TYP_ZAJEC, EGZAMIN FROM LISTA_PRZEDMIOTOW WHERE EGZAMIN = TAK ORDER BY NAZWA_PRZEDMIOTU ASC"; Następnie stwórz zmienną, która będzie przechowywała wynik zapytania, który uzyskamy używając funkcji mysql_query. Funkcja ta wymaga dwóch argumentów: zmienna połączenia oraz zmienną przechowującą zapytanie SQL, które przed chwilą stworzyłeś. $sql_result = mysql_query($sql,$connection); Aby użyć wyników zapytania ze zmiennej $sql_result, najpierw musimy rozdzielić wyniki na poszczególne wiersze używając funkcji mysql_fetch_array: while ($row = mysql_fetch_array($sql_result)) { // więcej kodu w tym miejscu } Pętla while stworzy tablicę o nazwie $row dla każdego z rekordów w zbiorze wyników. Aby wyciągnąć poszczególne elementy z rekordu (NAZWA_PRZEDMIOTU, TYP_ZAJEC, EGZAMIN), stworzymy zmienne: $nazwa = $row["NAZWA_PRZEDMIOTU"]; $typ = $row["TYP_ZAJEC"]; $egzamin = $row["EGZAMIN"]; Na pewno chciałbyś wyświetlić rezultaty w prostej tabelce HTMLa. Cofnij się trochę przed otwarciem pętli while i umieść przed nią taki kod : echo "<TABLE BORDER=1>"; echo "<TR><TH>NAZWA</TH><TH>TYP</TH><TH>EGZAMIN</TH>"; Po zdefiniowaniu zmiennych, możemy wyświetlić te dane w formacie tabelki: OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 8 SKiBD Laboratorium 8 echo "<TR><TD>$nazwa</TD><TD>$typ</TD><TD>$egzamin</TD></TR>"; Nowa pętla while będzie wyglądała tak: while ($row = mysql_fetch_array($sql_result)) { $nazwa = $row["NAZWA_PRZEDMIOTU"]; $typ = $row["TYP_ZAJEC"]; $egzamin = $row["EGZAMIN"]; echo "<TR><TD>$nazwa</TD><TD>$typ</TD><TD>$egzamin</TD></TR>"; } Po pętli while, musimy zamknąć tabelkę HTML: echo "</TABLE>"; Na końcu, powinniśmy zwolnić zasoby użyte przez to zapytanie, i zamknąć połączenie z bazą danych. Brak tego może doprowadzić do braków pamięci i innych przykrych niespodzianek, które mogą wystąpić. mysql_free_result($sql_result); mysql_close($connection); ?> ZADANIA DO WYKONANIA 1. Należy wykonać kreator www, którego kolejne kroki umożliwią: a) krok 1: wczytanie ilości liczb na których będziemy wykonywać operacje arytmetyczne (min 2) b) krok 2: wyświetlenie formularza umożliwiającego wprowadzenie odpowiedniej ilości liczb.. c) krok 3: wyświetlenie wyniku sumowania lub mnożenia wprowadzonych liczb 2. Zrealizować wysyłanie wyników na określony w trzecim kroku kreatora adres e-mail (należy dodać trzeci krok). UWAGA! Kreator może być zrealizowany przy wykorzystaniu jednego lub większej ilości skryptów 3. Należy przy pomocy narzędzia phpMyAdmin utworzyć tabelę w swojej bazie danych, wypełnić ją danymi, a następnie utworzyć skrypt pozwalający na wyświetlenie zawartości tej tabeli na swojej stronie WWW (kolejna podstrona strony głównej), w odpowiednio sformatowanej tabeli HTML. OBSŁUGA POCZTY W PHP I INTERFEJS KOMUNIKACJI Z BAZĄ DANYCH. 9