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