7. Instrukcje warunkowe, obsługa formularzy
Transkrypt
7. Instrukcje warunkowe, obsługa formularzy
KURS PHP
7. INSTRUKCJE WARUNKOWE, OBSŁUGA FORMULARZY
Dotychczas z formularzami nie mogliśmy zrobić nic specjalnego. Czas na małą odmianę.
Zanim jednak będziemy je obsługiwać poznajmy pierwszy typ (z dwóch) instrukcji
warunkowych.
Najprostszą instrukcją jest:
<?php
if (warunek) { działanie }
?>
Warunki i łączniki
To co jest w klamerkach zostanie wykonane, jeŜeli dany warunek jest spełniony. Tworząc
warunki przydadzą nam się następujące znaczki:
•
== - warunek spełniony, jeŜeli coś jest równe czemuś
•
!= - warunek spełniony, jeŜeli coś nie jest równe czemuś
•
< - warunek spełniony, jeŜeli coś jest mniejsze od czegoś
•
<= - warunek spełniony, jeŜeli coś jest mniejsze, lub równe czemuś
•
> - warunek spełniony, jeŜeli coś jest większe od czegoś
•
>= - warunek spełniony, jeŜeli coś jest większe, lub równe czemuś
Łącząc kilka warunków w jeden warunek oddzielamy je znaczkami:
•
&& - warunek spełniony, jeŜeli warunki po obu stronach tego znaczka są
spełnione
•
|| - warunek spełniony, jeŜeli jeden, lub dwa warunki po obu stronach tego znaczka
są spełnione
•
XOR - warunek spełniony, jeŜeli tylko jeden z dwóch po obu stronach tego
znaczka jest spełniony
www.INFORMATYKA.cba.pl
KURS PHP
Instrukcja warunkowa "if" w praktyce
Stwórzmy teraz kilka warunków, które będą oparte na zwykłych zmiennych z
wykorzystaniem wszystkich świeŜo poznanych "znaczków".
Warunek spełniony, jeŜeli zmienna $liczba1, jest równa 100:
<?php
$liczba1 = 100;
if ($liczba1 == 100)
{
echo "Warunek spełniony";
}
?>
Warunek spełniony, jeŜeli zmienna $liczba1 jest mniejsza od 100, a zmienna $liczba2 nie
jest równa 200:
<?php
$liczba1 = 100;
$liczba2 = 201;
if ($liczba < "100" && $liczba2 != "200") { echo "Warunek spełniony"; }
?>
Trzy warunki, które są spełnione, jeŜeli zmienna $liczba1 jest większa od 100, lub
zmienna $liczba2 jest równa 200:
<?php
$liczba1 = 512;
$liczba2 = 200;
if ($liczba1 > "100" || $liczba2 == "200") { echo "Warunek spełniony"; }
?>
<?php
$liczba1 = 99;
$liczba2 = 200;
if ($liczba1 > "100" || $liczba2 == "200") { echo "Warunek spełniony"; }
?>
www.INFORMATYKA.cba.pl
KURS PHP
<?php
$liczba1 = 512;
$liczba2 = 7;
if ($liczba1 > "100" || $liczba2 == "200") { echo "Warunek spełniony"; }
?>
Dwa warunki, które są spełnione, jeŜeli zmienna $liczba1 jest większa równa od 100, albo
zmienna $liczba2, jest równa 200:
<?php
$liczba1 = 101;
$liczba2 = 210;
if ($liczba1 > "100" XOR $liczba2 == "200") { echo "Warunek spełniony"; }
?>
<?php
$liczba1 = 100;
$liczba2 = 200;
if ($liczba1 > "100" XOR $liczba2 == "200") { echo "Warunek spełniony"; }
?>
Uwaga: pamiętaj, Ŝe w ostatnim przypadku liczba 100 nie jest większa od liczby 100 jest co najwyŜej większe równe, lub tylko równe.
W jednym warunku moŜe być więcej niŜ dwa warunki, mało tego mogą być łączone w
bardzo ciekawe sposoby. PoniŜszy warunek wykona się, jeŜeli zmienna $liczba1 jest
mniejsza od 100, albo $liczba2 jest równa 200 i $liczba3 jest równa 400:
<?php
$liczba1 = 101;
$liczba2 = 200;
$liczba3 = 400;
if ($liczba1 < "100" XOR $liczba2 == "200" && $liczba3 == 400) {
echo "Warunek spełniony";
}
?>
www.INFORMATYKA.cba.pl
KURS PHP
MoŜna takŜe stosować frazy nieobjęte w cudzysłowy, jakimi są TRUE (ang. prawda) i
FALSE (ang. fałsz). Przypisujemy je do zmiennych znaczkami równości - ==, lub moŜemy
całkowicie odwrócić ich działanie uŜywając znaczka !=. JeŜeli chcemy, aby warunek był
spełniony, w przypadku kiedy zmienna ma jakąkolwiek wartość uŜywamy warunku...
Zaprezentuje to na dwóch przykładach:
<?php
$liczba = 100;
if ($liczba == TRUE) { echo "Warunek spełniony"; }
?>
<?php
$fraza = tekst;
if ($fraza == TRUE) { echo "Warunek spełniony"; }
?>
Jak widzisz, instrukcje nie tylko operują na liczbach, ale i na treści, jak pokazuje
powyŜszy przykład.
Tak samo moŜemy postąpić, a nawet łatwiej w przypadku FALSE:
<?php
if ($fraza == FALSE) { echo "Warunek spełniony"; }
?>
Jak pewnie domyślasz się, niezadeklarowana zmienna nic nie zawiera więc warunek jest
spełniony. Teraz dla przykładu pokaŜę, jak uzyskać taki sam efekt, jak w poprzednim
przypadku uŜywając TRUE:
<?php
if ($fraza != TRUE) { echo "Warunek spełniony"; }
?>
Rozumując dosłownie po angielsku, pierwszy, tzn. przedostatni przykład wypełniał się,
jeŜeli zmienna zawierała nieprawdę, a drugi – ostatni jeŜeli zmienna nie zawierała prawdy.
Oczywiście jest to tym samym.
www.INFORMATYKA.cba.pl
KURS PHP
"else if" czyli warunki bardziej sprecyzowane
Instrukcje warunkowe moŜemy jeszcze sporo rozszerzyć. MoŜemy dodawać takŜe całe
nowe instrukcje, „w przeciwnym wypadku jeŜeli” i „w przeciwnym wypadku”. W „w
przeciwnym wypadku jeŜeli” po klamerce zamykającej poprzednią instrukcje dodajemy nową
zaczynającą się od else if, po której jest warunek i działanie w klamrach. Warunek ten
wykona się tylko wtedy, jeŜeli warunek znajdujący się nad nim nie zostanie spełniony i
oczywiście, jeŜeli sam warunek else if będzie spełniony. Pierwszy przykład prezentuje
sytuację, w której warunek else if nie jest spełniony, poniewaŜ wyŜej znajdujący się warunek
if jest spełniony:
<?php
$tekst = "Jeden";
if ($tekst == "Jeden") { echo "Warunek spełniony"; }
else if ($tekst == TRUE) { echo "Warunek w ostateczności spełniony"; }
?>
Teraz przekształćmy zmienną tak, aby wykonał się warunek else if, zmieńmy po prostu
zawartość zmiennej $tekst:
<?php
$tekst = "Jedenaście";
if ($tekst == "Jeden") { echo "Warunek spełniony"; }
else if ($tekst == TRUE) { echo "Warunek w ostateczności spełniony"; }
?>
Tak naprawdę warunków else if moŜe być bardzo duŜo i jeszcze więcej:
<?php
$tekst = "Jedenaście";
if ($tekst == "Jeden") { echo "Warunek spełniony"; }
else if ($tekst == "Dwa") { echo "Warunek spełniony"; }
else if ($tekst == "Trzy") { echo "Warunek spełniony"; }
else if ($tekst == TRUE) { echo "Warunek w ostateczności spełniony"; }
?>
www.INFORMATYKA.cba.pl
KURS PHP
A gdy nic nie pasuje - instrukcja "else"
Jak na razie nie wiemy, co zrobić, jeŜeli warunek nie jest spełniony nie korzystając z
FALSE, ani tym podobnych. Pisałem odrobinę wyŜej o samym warunku „w przeciwnym
wypadku”, którym jest samo else i klamerki. Umieszczamy go na końcu danej instrukcji,
czyli po zakończeniu instrukcji if, ewentualnie ostatniej instrukcji else if. Dwa przykłady:
<?php
$tekst = "Pięć";
if ($tekst == "Jeden") { echo "Warunek spełniony"; }
else { echo "Warunek nie spełniony"; }
?>
<?php
$tekst = "Pięć";
if ($tekst == "Jeden") { echo "Warunek spełniony"; }
else if ($tekst == "Dwa") { echo "Warunek spełniony"; }
else if ($tekst == "Trzy") { echo "Warunek spełniony"; }
else if ($tekst == "Czwarty") { echo "Warunek spełniony"; }
else { echo "Warunek nie spełniony"; }
?>
Integracja instrukcji warunkowych - przykłady
Mam nadzieję, Ŝe rozumiesz wszystko do tej pory. Oczywiście umieszczanie zmiennych
ręcznie, a następnie sprawdzanie, czy ich wartości są większe, mniejsze, czy zawierają
prawdę itp. jest czymś po prostu beznadziejnym, lepiej jest do tego wykorzystać zmienne z
tablic superglobalnych. Oto przykład zastosowania $_GET:
<?php
$tekst = "Pięć";
if ($_GET[tekst] == TRUE) {
echo "Zmienna \$_GET[tekst] zawiera $_GET[tekst]"; }
?>
www.INFORMATYKA.cba.pl
KURS PHP
Uwaga: do przykładów w instrukcjach warunkowych zakładam, Ŝe testujemy swoje
narastające zdolności PHP umieszczając kody w pliku index.php, jeŜeli tak nie jest...
zmieńmy nazwę naszego pliku php.
JeŜeli wejdziemy tak po prostu na tą stronę ujrzymy komunikat zawarty w instrukcji else,
ale gdy np. dokleimy do końca adresu coś takiego: ?tekst=nic, ujrzymy informację, Ŝe
zmienna $_GET[tekst] zawiera nic. Teraz warto byłoby wykorzystać jakiś formularz, nie
będziemy przecieŜ prosić internautów, aby sami dłubali się w wpisywaniu danych do adresu:
<?php
if ($_GET[tekst] == TRUE) {
echo "Zmienna \$_GET[tekst] zawiera $_GET[tekst]"; }
else { echo "
<FORM ACTION=\"index.php\" METHOD=\"get\">
Wpisz coś: <INPUT TYPE=\"text\" NAME=\"tekst\"><br />
<INPUT TYPE=\"submit\" VALUE=\"Zobacz co wpisałem\">
</FORM>";
}
?>
Uwaga: atrybut METHOD jest w tym przypadku zbędny, gdyŜ wartość get jest domyślna.
PowyŜszy skrypt sprawdza, czy zmienna $_GET[tekst] coś zawiera. JeŜeli tak wyświetla
informację, Ŝe zawiera to i to, a w przeciwnym wypadku formularz, który pozwala
wprowadzić daną do zmiennej. Jak pewnie zauwaŜyłeś nazwa pola, w którym umieszczasz
wartość zmiennej ma nazwę taką samą jak zmienna, tak samo będzie i w superglobalnych
tablicach $_POST. Mam nadzieję, Ŝe nie było to tak trudne jak się wydawało. Przejdźmy
teraz do $_POST.
W powyŜszym przypadku moŜna było spreparować specjalny link, który zrobi to, co mu
kaŜemy, nawet bez uŜycia formularza, co jest wielką wadą, przekonamy się w praktyce.
Zabezpiecza to superglobalna tablica $_POST, w której musimy wypełnić określone pola
formularza, a sam adres jest wciąŜ taki sam, tzn. nie przyrasta mu Ŝadnych dodatkowych
zmiennych. Oto podobny przykład do poprzedniego, w którym uŜyto wyłącznie $_POST:
www.INFORMATYKA.cba.pl
KURS PHP
<?php
if ($_POST[tekst] == TRUE) {
echo "Zmienna \$_POST[tekst] zawiera $_POST[tekst]"; }
else { echo "
<FORM ACTION=\"index.php\" METHOD=\"post\">
Wpisz coś: <INPUT TYPE=\"text\" NAME=\"tekst\"><br />
<INPUT TYPE=\"submit\" VALUE=\"Zobacz co wpisałem\">
</FORM>";
}
?>
O tych najwaŜniejszych zmiennych superglobalnych narazie tyle. Pamiętajmy, Ŝe nie
moŜemy wyznaczyć sobie lepszej i gorszej superglobalnej zmiennej. Zmienne $_POST
moŜemy uzyskać wyłącznie wypełniając formularze. Inną powaŜną wadą tych zmiennych jest
to, iŜ roboty wyszukiwarek podczas indeksowania stron nie wypełniają formularzy, które
prowadzą do kolejnych stron, te z kolei do kolejnych. Zmienne te są idealne w tworzeniu
formularzy sond itp., ale nie do nawigacji po serwisie. Zmienne $_GET eksponują swoją
zawartość w pasku adresu, co moŜe przerazić początkujących internautów, jednakŜe moŜemy
umieszczać ich zawartość w spreparowanych linkach, po których roboty indeksujące strony
lubią się przechadzać więc jest to i zaletą, i wadą. Przykład linku wykorzystującego dwie
zmienne $_GET:
index.php?zmienna1=wartosc1&zmienna2=wartosc2
Uwaga: aby link był zgodny ze specyfikacją W3C zamiast uŜywać znaków & musimy
uŜywać tzw. znaku specjalnego (nie mającego związku z innymi znakami PHP, gdyŜ jest
napisany w innym języku) &.
Instrukcje warunkowe przełącznikowe
Jest jeszcze jeden, na szczęście ostatni typ instrukcji warunkowych, tzw. przełącznik.
Przykład przełącznika bez wykorzystania tablic superglobalnych:
www.INFORMATYKA.cba.pl
KURS PHP
<?php
$tekst = "dwa";
switch ($tekst)
{
case "jeden":
echo "wybrałeś opcję jeden";
break;
case "dwa":
echo "wybrałeś opcję dwa";
break;
case "trzy":
echo "wybrałeś opcję trzy";
break;
}
?>
Budowa tej instrukcji jest dość ciekawa. Zaczynamy od słowa switch (ang. przełącznik),
po którym w nawiasie widnieje nazwa zmiennej, która jest później warunkowana, o ile jest
takie słowo. Następnie wewnątrz klamerki znajdują się słowa case (ang. przypadek), obok
którego w cudzysłowie, ewentualnie w apostrofie znajduje się warunek, konkretnie co
zmienna moŜe zawierać, aby warunek był spełniony, a następnie dwukropek. Następnie jest
działanie danego warunku, w naszym przypadku wyświetlenie danej opcji, a następnie
instrukcja break, której zadaniem jest zakończenie danego przypadku, konkretnie dwukropka
będącego za cudzysłowem przypadku. MoŜemy dodawać kolejne przypadki dodając kolejne
elementy, które zostały oddzielone wolną linią w powyŜszym kodzie. Oto zastosowanie tej
instrukcji wraz z formularzem, po raz pierwszy klamry będziemy umieszczać w klamrach:
www.INFORMATYKA.cba.pl
KURS PHP
<?php
if ($_POST[tekst] == TRUE) {
switch ($_POST[tekst])
{
case "jeden":
echo "wybrałeś opcję jeden";
break;
case "dwa":
echo "wybrałeś opcję dwa";
break;
case "trzy":
echo "wybrałeś opcję trzy";
break;
}
}
else {
echo "<FORM ACTION=\"index.php\" METHOD=\"post\">
Wybierz coś: <SELECT NAME=\"tekst\">
<OPTION VALUE=\"jeden\">jeden</OPTION>
<OPTION VALUE=\"dwa\">dwa</OPTION>
<OPTION VALUE=\"trzy\">trzy</OPTION>
</SELECT><br />
<INPUT TYPE=\"submit\" VALUE=\"Zobacz co wpisałem\">
</FORM>";
}
?>
Z jakich instrukcji korzystać
Osobiście muszę się przyznać, Ŝe nie przepadam za instrukcjami – przełącznikami i
wydaje mi się, Ŝe ty teŜ ich nie polubisz z prostego przypadku - if będziesz uŜywał częściej,
gdyŜ ta instrukcja pozwala na ściślejsze precyzowanie warunków.
Uwaga: jeŜeli chcemy instrukcji – przełącznikowi przypisać jakąś wartość, która będzie
spełniana w przypadku nie spełnienia Ŝadnej innej moŜemy zamiast case „warunek”: napisać
default: (ang. domyślny).
www.INFORMATYKA.cba.pl
KURS PHP
Uwaga: w kaŜdym przypadku instrukcji warunkowych, czy to if (w tym takŜe else if i
else), czy to switch działaniem spełnienia warunku było wyświetlenie komunikatu za pomocą
instrukcji echo. Oczywiście moŜna zrobić w nich setki innych rzeczy – deklarować zmienne,
czy nawet nowe funkcje, wyświetlać całe ogromne strony itp. itd.
www.INFORMATYKA.cba.pl