SSK - Techniki Internetowe Ćwiczenie 2. Obsługa formularzy. Operatory, instrukcje warunkowe oraz instrukcje pętli w PHP. Obsługa formularzy Skryptu PHP moŝna uŝyć do obsługi formularza HTML. Aby tego dokonać, formularz ten naleŝy najpierw odpowiednio przygotować. W parametrze ACTION znacznika FORM naleŝy podać adres dokumentu PHP mającego obsłuŝyć dany formularz. Parametr METHOD moŝe mieć wartość POST lub GET - obydwie metody są obsługiwane przez PHP. Jednak naleŝy pamiętać, Ŝe formularze wysyłane przez GET mają ograniczoną długość. Prosty przykład : skrypt1.html <HTML> <HEAD> <TITLE> Strona z formularzem obsługiwanym przez PHP</TITLE> <META HTTP-EQUIV="content-type" CONTENT="text/html; CHARSET=iso-8859-2"> </HEAD> <BODY> <FORM ACTION=skrypt2.php METHOD=POST> Podaj swoje imię: <INPUT TYPE=TEXT SIZE=20 NAME=imie> </FORM> </BODY> </HTML> skrypt2.php print("witaj, $imie!"); Strona 1
Obsługa bardziej złoŝonych formularzy zademonstrowana zostanie w skryptach 5. oraz 6. naszego ćwiczenia. Instrukcje warunkowe: if, if if oraz switch - case Niekiedy chcemy, aby dany fragment kodu wykonywał się warunkowo. Stosuje się wówczas na przykład instrukcję if: if($a>$b) echo("$a jest większe od $b"); JeŜeli wartość $a jest większa od $b, wyświetli się napis "$a jest większe od $b". Warunek po if jest spełniony, jeŝeli wyraŝenie w nawiasie ma wartość róŝną od zera. Instrukcja if moŝe być rozszerzona o słowo kluczowe bądź if. Inną instrukcją warunkową, takŝe znaną z języka C, jest tzw. instrukcja wyboru switch. W poniŝszym przykładzie do obsługi formularza zawartego w pliku skrypt3.html wykorzystano kolejno skrypty: skrypt4a.php, skrypt4b.php oraz skrypt4c.php. Ich działanie jest jednakowe, jednak zastosowano w nich róŝne instrukcje warunkowe. Proszę przeanalizować działanie skryptów oraz składnię poszczególnych instrukcji. skrypt3.html <HTML> <HEAD> <TITLE> Test </TITLE> <META HTTP-EQUIV="content-type" CONTENT="text/html; CHARSET=iso-8859-2"> </HEAD> <BODY> <FORM ACTION=skrypt4a.php METHOD=POST> Podaj swój wiek: <INPUT TYPE=TEXT SIZE=3 NAME=wiek> </FORM> </BODY> </HTML> skrypt4a.php if($wiek>=65) echo("witaj, emerycie!"); if ($wiek<65&&$wiek>35) echo("wspaniały wiek produkcyjny!"); Strona 2
echo("oszczędzaj się. <BR>"); echo("jeszcze się napracujesz!"); skrypt4b.php if($wiek>=65) echo("witaj, emerycie!"); if ($wiek<65 && $wiek>35) echo("wspaniały wiek produkcyjny!"); echo("oszczędzaj się. <BR>"); echo("jeszcze się napracujesz!"); skrypt4c.php switch($wiek) case $wiek >= 65 : echo("witaj, emerycie!"); break; case $wiek < 35 : echo("oszczędzaj się. <BR>"); echo("jeszcze się napracujesz!"); break; default: echo("wspaniały wiek produkcyjny!"); Strona 3
Instrukcje pętli: while, do while, for oraz foreach Aby dany fragment kodu wykonać wielokrotnie, stosuje się pętle. PHP obsługuje cztery rodzaje pętli: while, do while, for oraz foreach. Składnia trzech pierwszych jest identyczna, jak składnia odpowiednich pętli języka C. Najprostszą z nich jest pętla while: $a=0; while($a<5) echo("$a "); W pętli while najpierw sprawdzany jest warunek (w tym wypadku $a<5). JeŜeli jest on spełniony, pętla wykonuje się i wraca do sprawdzenia warunku. JeŜeli warunek nie jest spełniony, wykonanie pętli kończy się. PowyŜszy skrypt wyświetli zatem liczby od 0 do 4. Instrukcja do - while róŝni się od instrukcji while tym, Ŝe najpierw wykonuje się pętla, a dopiero potem sprawdzany jest warunek. Oznacza to, Ŝe pętla zawsze wykona się co najmniej jeden raz. RóŜnica będzie widoczna np. w poniŝszym przykładzie: $a=6; do echo("$a "); while($a<5); /* ta pętla wykona się 1 raz */ oraz $a=6; while($a<5) echo("$a "); /* instrukcje w tej pętli nie zostaną wykonane */ Z kolei pętla for ma następującą składnię: for($a=0;$a<5;$a++) echo("$a "); Odpowiada to następującemu wykonaniu pętli while: Strona 4
$a=0; while($a<5) echo($a); MoŜna to teŝ zapisać w następujący sposób: for($a=0;$a<5;echo("$a "), $a++); Wykonanie pętli moŝna w kaŝdym momencie zakończyć. SłuŜy do tego instrukcja break: $a=0; while($a<10) if($a==3) break; Ta pętla nie wykona się 10 razy - gdy zmienna $a osiągnie wartość 3, wykonanie pętli zostanie przerwane. MoŜna teŝ przejść do następnego powtórzenia - słuŝy do tego instrukcja continue: $a=0; while($a<10) if($a==3) continue; echo("aaa"); // ta instrukcja wykona się tylko gdy $a nie // jest równe 3 Specyficzną instrukcją pętli języka PHP jest pętla foreach. Pętle tę stosujemy do obsługi tablic o nieznanej ilości elementów. Pętla ta przebiega po wszystkich elementach takiej tablicy. Posiada ona dwa formaty: foreach($nazwatablicy As $ElementTablicy) instrukcjie oraz: foreach($nazwatablicy As $IndeksTablicy => $ElementTabllicy) instrukcje Strona 5
Pierwsza postać pętli przebiega po podanej tablicy i w kaŝdym przebiegu wartość bieŝącego elementu jest przypisywana zmiennej $ElementTablicy, zaś wskaźnik bieŝącego elementu tablicy jest przesuwany. Druga postać róŝni się tylko tym, Ŝe do zmiennej $IndeksTablicy jest przypisywany bieŝący indeks elementu. Przykład zastosowania drugiego rodzaju pętli foreach: $kraje = array("pl" => "Polska", "de"=> "Niemcy", "uk"=> "Wielka Brytania"); foreach($kraje As $domena => $wartosc) echo "$wartosc: domena \"$domena\" <br>"; W wyniku tego programu zostanie wyświetlona (krótka) lista krajów i odpowiadających im domen. Operatory Większość operatorów w PHP to konstrukcje bardzo zbliŝone do odpowiednich operatorów języka C. Z tego względu wymienimy tylko niektóre operatory, specyficzne dla PHP: Operator identyczności: $a === $b Wartość: True, jeŝeli $a jest równe $b i są one tych samych typów Operator wykonania oznaczamy znakiem ` (jest to znak umieszczony na tym samym klawiszu co znak tyldy). WyraŜenie otoczone tymi znakami jest wykonywane na serwerze, zaś zwracana wartość przypisywana zmiennej. Przykładowo, aby przypisać zmiennej $list zawartość katalogu bieŝącego (na serwerze), moŝemy wykonać polecenie: $list = `ls -l`; Operator kontroli błędów oznaczamy znakiem @. Umieszczenie tego operatora przed wyraŝeniem powoduje, Ŝe błędy nie są wyświetlane w oknie przeglądarki lecz zapamiętane zostaną w zmiennej globalnej $php_errormsg. NaleŜy jednak pamiętać, Ŝe zmienna ta jest nadpisywana przez kolejne błędy. Do prawidłowego uŝycia tego operatora konieczna jest uaktywniona na serwerze opcja track_errors. Celem działania kolejnych dwóch skryptów jest obliczenie, w oparciu o datę podaną przez uŝytkownika w formularzu, kolejnego numeru dnia w roku, bądź liczby dni, jakie pozostały do końca roku. Domyślnie w oknach formularza wyświetlana jest bieŝąca Strona 6
data systemowa. W skryptach tych zaprezentowano m.in. działanie niektórych z operatorów języka PHP, oraz instrukcje pętli. skrypt5.php <HTML> <HEAD> <TITLE> Obliczanie dnia roku</title> <META HTTP-EQUIV="content-type" CONTENT="text/html; CHARSET=iso-8859-2"> </HEAD> <BODY> <FORM ACTION=skrypt6.php METHOD=POST> <B>Podaj datę:</b> <BR> <TABLE CELLSPACING=20> <TR> <TD> Dzień: <INPUT TYPE=TEXT SIZE=2 NAME=Dzien VALUE= <? echo(date("j")); > <TD> Miesiąc: <SELECT NAME="Miesiac" SIZE=1> <? $miesiace=array("styczeń","luty","marzec","kwiecień","maj","czerwiec", "Lipiec","Sierpień","Wrzesień","PaŜdziernik","Listopad","Grudzień"); for($i=0;$i<=11;$i++) echo ("<OPTION "); if (date("n")==$i+1) echo("selected "); echo("value=$i> $miesiace[$i] </OPTION> \n"); </SELECT> <TD> Rok: <INPUT TYPE=TEXT SIZE=4 NAME=Rok VALUE=<? echo(date("y")); > </TR> <TR> <TD> Policz, ile dni:<br> <INPUT TYPE=RADIO NAME=jak VALUE=pocz CHECKED> minęło od początku roku<br> <INPUT TYPE=RADIO NAME=jak VALUE=konc > pozostało do końca roku </TR> <TR> <TD> <INPUT TYPE=CHECKBOX CHECKED NAME=mail> Prześlij na adres e-mail: <TD> <INPUT TYPE=TEXT SIZE=30 NAME=adres VALUE="konto@elektra.weia.po.opole.pl"> Strona 7
</TR> <TR> <TD> <INPUT TYPE=SUBMIT VALUE="Wyślij"> <INPUT TYPE=RESET VALUE="Wyczyść"> </TR> </TABLE> </FORM> </BODY> </HTML> skrypt6.php // funkcja obliczająca numer kolejny dnia w roku function DzienRoku( $Rok, $Miesiac, $Dzien ) if ($Rok%4 == 0 && $Rok%100!=0 $Rok%400 == 0) $Przestepny = 1; // rok przestępny $Przestepny = 0; // rok zwykły $TablicaDni = array(31,28+$przestepny,31,30,31,30,31,31,30,31,30,31); for ($i=0;$i<$miesiac;$i++) $Dzien+=$TablicaDni[$i]; return $Dzien; // program główny if ($jak=="pocz") $ile = DzienRoku($Rok, $Miesiac, $Dzien); $Miesiac+=1; $tresc = "$Dzien.$Miesiac.$Rok to $ile. kolejny dzień roku $Rok."; $ile = DzienRoku($Rok, 11, 31) - DzienRoku($Rok, $Miesiac, $Dzien); $Miesiac+=1; $tresc = "Od dnia $Dzien.$Miesiac.$Rok do końca roku $Rok pozostało $ile dni."; print($tresc); if ($mail=="on") mail($adres,"waŝna Informacja",$tresc); Strona 8
Przetestować działanie skryptów oraz przeanalizować ich składnię, w szczególności zaś: - sposób wpisu do elementów formularza bieŝącej daty systemowej (funkcja PHP date() ), - sposób wygenerowania przez PHP elementów listy rozwijalnej z nazwami kolejnych miesięcy roku, - sposób sprawdzenia przez funkcję DzienRoku, czy dany rok jest rokiem przestępnym: dany rok jest przestępny, jeśli jego liczba jest podzielna przez 4, z wyjątkiem lat podzielnych przez 100, jednak lata podzielne przez 400 są latami takŝe latami przęstepnymi. Zapoznać się z zastosowanymi tam operatorami. - sposób odczytu wartości poszczególnych pól formularza przez skrypt PHP. Spróbować samodzielnie zmodyfikować skrypty, np. w następujący sposób: - zastąpić instrukcję pętli for instrukcją pętli while, a następnie instrukcją pętli do - while, w sposób równowaŝny działaniu pętli for, - wprowadzić zabezpieczenie przed podaniem przez uŝytkownika złej wartości dnia miesiąca skrypt powinien wtedy wyświetlić informację o błędzie. Na zakończenie: Spróbować napisać dwa skrypty, które będą wykonywać zadanie odwrotne do powyŝszego: na podstawie podanego przez uŝytkownika w oknie tekstowym dnia kolejnego roku oraz roku, skrypt powinien wyświetlać odpowiadającą mu datę (dzień/miesiąc/rok). Strona 9