Professional Documents
Culture Documents
PHP5. Tworzenie Stron WWW. Ćwiczenia Praktyczne. Wydanie II
PHP5. Tworzenie Stron WWW. Ćwiczenia Praktyczne. Wydanie II
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Kociuszki 1c
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Wstp
7
13
17
18
21
33
Pierwsze skrypty
Zmienne, stae, operatory
Instrukcja warunkowa
Ptla for
Ptle while i dowhile
Instrukcja wyboru (switch)
Funkcje
Zoone struktury danych
tablice zwyke i tablice asocjacyjne
34
37
44
49
53
56
58
76
87
87
101
109
119
128
147
169
Licznik tekstowy
Licznik graficzny
Ksiga goci
Newsy na stronie
Ankieta
Ring
Galeria zdj
Analiza dziennikw serwera
Forum dyskusyjne
170
179
185
191
201
207
212
215
221
227
228
232
234
240
249
249
251
255
88
Metod w formularzu moe by take GET (jest to zreszt metoda domylna: jeeli nie wpiszesz w definicji formularza adnej, zostanie
uyta wanie ta). Metody rni si midzy sob sposobem przekazywania danych do serwera. Jeeli uyjesz metody GET, dane z formularza zostan doklejone do adresu skryptu odbierajcego formularz po
znaku zapytania. Adres bdzie wic mia posta:
http://adres.serwera/skrypt.php?pole1=wart1&poleh=warth&..&poleN=wartN
89
W I C Z E N I E
4.1
Warto sprawdzi, jak dziaa skrypt, zarwno z wykorzystaniem metody GET, jak i POST. Pamitaj, e poza zmian metody w formularzu
musisz te zmieni nazw tablicy, z ktrej s odczytywane dane, na
$_POST. Zauwa rnic w adresie po wysaniu formularza za pomoc
jednej i drugiej metody.
90
Wpisz w polu formularza tekst <H1>tekst</H1>. Pojawi si niespodziewany efekt wywietlony tekst zostanie wypisany du czcionk. Dzieje si tak, poniewa wpisany tekst wklejasz bezporednio
do kodu strony. Jeszcze ciekawszy efekt uzyskasz, wpisujc tekst
<script>alert(123);</script>.
Jak widzisz, atwo straci kontrol nad tym, co wywietla strona, jeeli wywietlane na niej dane pochodz bezporednio z formularza.
Sprawa nie jest powana, jeeli chodzi tylko o stron wysyan pojedynczemu klientowi po wpisaniu przez niego danych. Mona sobie
jednak wyobrazi ksig goci z wpisami gromadzonymi w bazie danych i wywietlanymi na danie. Jeeli do bazy bdziesz wpisywa
nieobrobione dane z formularza, efekty dziaania odwiedzajcych (czasem zupenie niepodane) bd ogldali wszyscy. Z tego powodu
powiniene stosowa funkcj oczyszczajc wpisywane dane, szczeglnie takie, ktre mog si pojawi na stronach WWW.
W I C Z E N I E
4.2
Popraw program z wiczenia 4.1 tak, by przetwarza wpisane dane, aby byy bezpieczne w wywietlaniu. Sprawd jego dziaanie na przykadach z poprzedniego wiczenia.
W przyszoci zapewne przygotujesz wasn funkcj oczyszczajc
wprowadzane dane. W zalenoci od ich charakteru, funkcja powinna wykonywa rne operacje. Na pocztek wykorzystaj wbudowan
funkcj PHP, ktra znaczniki HTML-a przetworzy na bezpieczne do
wywietlenia. W szczeglnoci zamieni znaki wikszoci i mniejszoci
na > i <, co spowoduje, e wpisane znaczniki HTML nie zostan przy ich doczeniu do strony zinterpretowane, lecz wywietlone.
htmlspecialchars
91
4-02.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Formularz</TITLE>
</HEAD>
<BODY>
<? // Drukuje formularz i jednoczenie odbiera i wywietla wpisane
// w nim dane. Dane s przetworzone funkcj htmlspecialchars.
if ($_GET['tekst']) { // jest wpisana jaka warto w formularzu
$tekst = htmlspecialchars ($_GET['tekst']);
print "Wpisana warto to <B>$tekst</B><BR>';
print '<A HREF="4-0h.php">Powrt do formularza</A>";
} else { // nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-0h.php" METHOD=GET>';
print '<INPUT TYPE="text" NAME="tekst">';
print '<INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>
4.3
Utwrz program, ktry bdzie wywietla formularz z moliwoci wpisania trzech danych:
a, b i c, po czym wywietli rozwizanie rwnania kwadratowego: ax + bx + c = 0.
2
92
93
4.4
94
95
W I C Z E N I E
4.5
Napisz program, ktry wywietli menu, a nastpnie pokae wybran przez uytkownika opcj.
Wybran przez uytkownika opcj okrel za pomoc instrukcji switch.
Na podstawie wartoci zmiennej $opcja w $cowyorano zapamitaj j.
Poniewa zostaa wykorzystana metoda POST, w adresie jej nie zauwaysz.
4-05.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Menu w formularzu</TITLE>
</HEAD>
<BODY>
<? // Wywietla formularz z menu, a nastpnie wywietla wybran przez
// uytkownika opcj.
if ($_POST['opcja']) {
// wartoci w formularzu s wpisane
switch ($_POST['opcja']) {
case 'pilka': $cowybrano = 'pika nona'; break;
case 'kosz': $cowybrano = 'koszykwka'; break;
case 'siat': $cowybrano = 'siatkwka'; break;
case 'nar': $cowybrano = 'narciarstwo'; break;
case 'hokej': $cowybrano = 'hokej'; break;
case 'boks': $cowybrano = 'boks'; break;
case 'inny': $cowybrano = 'inny sport'; break;
default: $cowybrano = 'niezidentyfikowana opcja'; break;
}
print ("Uytkownik wybra opcj: <B>$cowybrano</B>.<BR>");
print '<BR><A HREF="4-05.php">Powrt do formularza</A>';
} else {
// nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-05.php" METHOD=POST>';
print '<SELECT NAME="opcja">';
print '<OPTION SELECTED VALUE="">-> wybierz, jak sport
lubisz:';
print '<OPTION VALUE="pilka">pika nona';
print '<OPTION VALUE="kosz">koszykwka';
print '<OPTION VALUE="siat">siatkwka';
96
print
print
print
print
print
print
print
'<OPTION VALUE="nar">narciarstwo';
'<OPTION VALUE="hokej">hokej';
'<OPTION VALUE="boks">boks';
'<OPTION VALUE="inny">inny sport';
'</SELECT>';
'<INPUT TYPE="submit" VALUE="Wylij">';
'</FORM>';
?>
</BODY>
</HTML>
4.6
97
W bardzo podobny sposb mona oprogramowa przyciski opcji. Sprbuj samodzielnie zmieni powyszy program tak, by wywietla je
zamiast menu. Rozwizanie znajduje si w pliku 4-06a.php.
W nieco inny sposb naley zaprogramowa pola wyboru, w ktrych
uytkownik moe zaznaczy wicej ni jedn opcj.
98
W I C Z E N I E
4.7
?>
</BODY>
</HTML>
99
Celowo uyto metody GET, aby w adresie mona byo zobaczy, w jaki sposb s przekazywane informacje o wybranych przy uyciu pl
wyboru opcjach.
W kadym przebiegu ptli foreach jako $kldcz zostanie podstawiona
odpowiednia nazwa klucza, dziki czemu mona odwoa si do zawartoci tablicy $_GET i pobra zmienn formularza o odpowiedniej
nazwie.
Ze wzgldu na to, e uytkownik moe wybra wicej ni jedn opcj
menu, nie wywietlasz tylko jednej z nich, lecz zbierasz w ptli
w zmiennej $cowyorano wszystkie wybrane opcje.
Wyjtkow rol w formularzach speniaj pola ukryte. Jeeli do tej pory nie miae stycznoci z aplikacjami dziaajcymi po stronie klienta
(client-side), moesz wtpi w ich sens. Nic bardziej mylnego s
niezmiernie pomocne podczas przekazywania informacji pomidzy
kolejnymi formularzami przedstawianymi uytkownikowi do wypenienia. Na pewno docenisz je po wykonaniu poniszego wiczenia.
W I C Z E N I E
4.8
Napisz program, ktry w pierwszym formularzu zbierze informacje o tym, jakim towarem jest zainteresowany uytkownik, a w drugim, jak si nazywa. Po wpisaniu wszystkich potrzebnych danych program powinien wywietli zebrane informacje.
Tym razem instrukcja warunkowa bdzie bardziej skomplikowana
wszak musisz, w zalenoci od sytuacji, wywietli dwa formularze
lub kocowy wynik. Pierwszy warunek bdzie informowa, e uytkownik nie wybra jeszcze adnego towaru, drugi e nie poda
swoich danych. Jeeli oba bd spenione, zostanie wywietlona informacja o wyborze uytkownika.
4-08.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Co chciaby</TITLE>
</HEAD>
<BODY>
100
Warto zauway, e informacje o wybranych towarach s przekazywane pomidzy pierwszym formularzem i stron kocow poprzez
ukryte pola, zaszyte w drugim formularzu.
Czsto si zdarza, e chcesz dane wpisane przez uytkownika w formularzu otrzyma poczt elektroniczn. Jeeli korzystasz z systemu
Unix, sprawa jest atwa istnieje funkcja mail, ktra si tym zajmie.
Wywoanie jej w postaci:
mail ('odbiorcamadres.pl', 'Wiadomo testowa', 'Tak dziaa funkcja mail',
"From: wwwadmin@serwer.pl\r\n");
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 101
Cookies
Jeeli ju miae do czynienia z programowaniem po stronie serwera
lub uywae JavaScriptu w bardziej zaawansowany sposb, pewnie
wiesz, czym s cookies. Jeeli nie, zapewne informacja posaem
uytkownikowi ciasteczko wywouje u Ciebie konsternacj. Zwr
uwag, e takie ciasteczko (ang. cookie) nie jest sposobem osodzenia
ycia osobom ogldajcym stron (cho kady twrca stron powinien
ich houbi), a jedynie prost metod zapamitania pewnych danych
o kliencie w jego przegldarce.
Zasada jest prosta. O ile uytkownik wyrazi na to zgod (decyduj
o tym ustawienia jego przegldarki), masz prawo zapisa pewne dotyczce go informacje na jego dysku. Warto zapamita, e:
1. tylko Twj serwis bdzie mg pozyska je z powrotem;
2. uytkownik moe zabroni ich zapisu i nadzorowa dowolnie
ich tre.
Oba fakty (jeli wzi pod uwag prawo kadego do prywatnoci) wydaj si bardzo sensowne. Pomimo tych ogranicze cookies mog by
bardzo przydatne webmasterowi. Moesz je na przykad wykorzystywa, by umoliwi osobom, ktre wyra na to zgod, zapamitanie ich
danych przy kolejnym wypenianiu formularza. To due uatwienie
dla odwiedzajcych, a wiele osb udostpnia w ten sposb swoje dane
102
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 103
q informacj path, ktra okrela, dla jakiego podkatalogu serwisu
4.9
Napisz program, ktry bdzie zlicza, ile razy uytkownik wywietli dan stron w czasie
dziaania jego przegldarki.
To bardzo typowy przykad zastosowania cookie. Bdziesz w nim
przechowywa informacj o liczbie wywietle danej strony. Cookie
bdzie nosio nazw ile, a jego wartoci bdzie liczba wywietle
strony. Dostp do informacji jest trywialny i bardzo podobny do odczytu danych z formularza. Warto ciastka o nazwie ile jest pamitana w specjalnej tablicy $_COO$_E w polu ile, wic moesz j odczyta
poprzez $_COO$_E['ile'].
W celu przesania uytkownikowi cookie posu si poleceniem
setcookie.
setcookie Posya uytkownikowi cookie. Funkcja posiada sze
104
4-09.php
<? // Program zlicza liczb wywietle przez uytkownika danej strony
// w czasie dziaania przegldarki. Informacja jest zbierana w cookie.
setcookie ('ile', ++$_COOKIE['ile']);
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Ile razy?</TITLE>
</HEAD>
<BODY>
<?
print "Stron odwiedzie ".$_COOKIE['ile']." razy w czasie
biecego ";
print "uruchomienia przegldarki";
?>
</BODY>
</HTML>
Wad programu jest to, e zlicza odwiedziny jedynie w czasie dziaania przegldarki. Po jej ponownym wczeniu rozpocznie obliczenia
od 1. Aby to poprawi, powiniene ustali termin wanoci cookie.
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 105
W I C Z E N I E
4.10
Napisz program, ktry bdzie zlicza liczb wywietle strony przez uytkownika
nawet po wyczeniu przez niego przegldarki.
Zadanie jest bardzo proste. W celu jego realizacji uyj trzeciego argumentu funkcji setcookie daty wanoci ciastka.
4-10.php
<? // Program zlicza liczb wywietle przez uytkownika danej strony.
// Informacja jest zbierana w cookie, ktrego wano wynosi 30 dni.
setcookie ('ileh', ++$_COOKIE['ileh'], time()+h59h000);
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Ile razy?</TITLE>
</HEAD>
<BODY>
<?
print "Stron odwiedzie ostatnio ".$_COOKIE['ileh']." razy.";
?>
</BODY>
</HTML>
106
Powysze przykady nie s w praktyce szczeglnie przydatne. Sprbuj teraz wykorzysta poznan technologi do realizacji uytecznych zada.
W I C Z E N I E
4.11
Napisz program, ktry wywietla formularz pobierajcy imi i nazwisko uytkownika. Jeeli uytkownik wyrazi na to zgod, program powinien zapamita wpisane
dane w cookies w celu uproszczenia ponownego wypenienia formularza.
W wywietlanym formularzu uwzgldnij pole wyboru, ktre pozwoli
uytkownikowi na decyzj, czy chce, by jego dane zostay zapamitane,
czy te nie. Kademu uytkownikowi posyasz cookies w zalenoci
od jego wyboru z wpisanymi wartociami lub z wartociami pustymi,
by usun ewentualne poprzednio zapisane informacje.
4-11.php
<? // Drukuje formularz i jednoczenie odbiera i wywietla wpisane
// w nim dane. Informacje s zapisywane w cookie.
$imie = htmlspecialchars ($_POST['imie']);
$nazwisko = htmlspecialchars ($_POST['nazwisko']);
$imiecookie = htmlspecialchars ($_COOKIE['imiecookie']);
$nazwiskocookie = htmlspecialchars ($_COOKIE['nazwiskocookie']);
if (($nazwisko) && ($imie)) { // s wpisane wartoci w formularzu
if ($_POST['pamietac']) {
setcookie ("imiecookie", "$imie", time()+h59h0000);
setcookie ("nazwiskocookie", "$nazwisko", time()+h59h0000);
} else {
setcookie ("imiecookie", "");
setcookie ("nazwiskocookie", "");
}
}
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Pamitasz imi i nazwisko</TITLE>
</HEAD>
<BODY>
<?
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 107
if (($nazwisko) && ($imie)) { // s wpisane wartoci w formularzu
print "Wpisana warto to <B>$imie $nazwisko</B>.<BR>";
print '<A HREF="4-11.php">Powrt do formularza</A>';
} else { // nie ma wpisanych danych, wywietlasz formularz
print '<FORM ACTION="4-11.php" METHOD=POST>';
print '<TABLE><TR><TD>nazwisko: </TD><TD><INPUT TYPE="text" ';
print "NAME=\"nazwisko\" VALUE=\"$nazwiskocookie\"></TD></TR>";
print '<TR><TD>imi: </TD><TD><INPUT TYPE="text" ';
print "NAME=\"imie\" VALUE=\"$imiecookie\"></TD></TR></TABLE>";
print 'Chc, eby program pamita dane: <INPUT TYPE="checkbox"';
print 'NAME="pamietac"><BR>';
print '<BR><INPUT TYPE="submit" VALUE="Wylij">';
print '</FORM>';
}
?>
</BODY>
</HTML>
4.12
108
Postaraj si, by o ile to moliwe uytkownik przy kolejnej wizycie na stronie w pierwszej kolejnoci oglda te bannery, ktrych
jeszcze nie widzia.
Dla kadego bannera w cookie zapamitaj informacj, i by ju wywietlony danemu uytkownikowi. Pi bannerw zamieszczono
w katalogu bannery w przykadach na serwerze.
4-12.php
<? // System wywietlania bannerw, ktry stara si, by uytkownikowi
// nie wywietli powtrnie bannera, dopki nie obejrzy przynajmniej
// raz wszystkich.
for ($i=1; $i<=5; $i++) { // sprawdzasz, ktre bannery ju wywietlano
$jest = $_COOKIE['banner'.$i];
if (!($jest)) { $tab[] = $i; $znaleziono = 1; }
}
// jeeli nie wywietlano, wczasz do tabeli wszystkie.
if (!($znaleziono)) { for ($i=1; $i<=5; $i++) { $tab[$i-1] = $i; }}
$nr= $tab[rand()%count($tab)];
setcookie ("banner".$nr, "1", time()+86400);
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Losowy (prawie?) banner</TITLE>
</HEAD>
<BODY>
<?
print "<IMG SRC=\"bannery/$nr.gif\">";
?>
</BODY>
</HTML>
W pierwszej ptli for sprawdzasz, ktre bannery nie byy jeszcze wywietlane. Jeeli taki znajdziesz, wpisz jego numer do tabeli. Warto
zauway, e kolejna dana jest dopisana do tablicy w niespotykany
jeszcze sposb: $tao[ ] odwouje si do pierwszego wolnego pola w tabeli jest to bardzo wygodna i czsto stosowana konstrukcja.
Jeeli nie znaleziono adnego bannera, ktry nie by jeszcze wywietlony, uznajesz, e uytkownik widzia ju wszystkie. W zwizku z tym
mona mu wywietli dowolny z nich wic wszystkie dopisujesz
do tablicy. Nastpnie losujesz numer z tabeli (zwr uwag na sposb,
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 109
Obsuga plikw
Do tej pory dane dla tworzonych przez Ciebie programw byy wpisywane z klawiatury, a wyniki wypisywane na ekranie. Przydaaby si
jednak take metoda pamitania informacji w jaki trwalszy i atwy
do przekazania programowi sposb. Taki warunek speniaj pliki
dyskowe. PHP potrafi zapisywa i odczytywa pliki w systemie operacyjnym serwera. Naley podkreli jeszcze raz: jeste w stanie (zgodnie z uprawnieniami, ktre zostan tam nadane odpowiednim katalogom i plikom) tworzy, zapisywa, odczytywa i usuwa pliki na
serwerze. Na serwerze, a nie na komputerze uytkownika.
Zapis i odczyt plikw moe by niezwykle przydatny do zapamitania
niewielkich iloci informacji zarwno dla caego serwisu, jak i dla pojedynczego uytkownika. Tak naprawd mechanizm sesji przedstawiony
110
4.13
Napisz program, ktry w podkatalogu dane utworzy plik z Twoim imieniem i nazwiskiem.
Na pocztku naley utworzy katalog dane, w ktrym powstanie plik.
Jeeli korzystasz z systemu Windows, sprawa jest prosta: po prostu
utwrz go jako podkatalog tego, w ktrym przechowujesz pliki PHP.
Jeeli natomiast korzystasz z serwera linuksowego, musisz jeszcze
nada odpowiednie prawa katalogowi, w celu umoliwienia wszystkim zapisu. Pozwoli na to program FTP, ktrego uywasz (jeeli nie,
koniecznie go zmie!). Ustaw dla katalogu prawa na 666.
Wykorzystaj trzy funkcje operujce na plikach.
fopen
fpdts
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 111
$plik = mfopen ("dane/imienazwisko.txt", "w");
if (!($plik)) {
print "BD: Nie da si utworzy pliku.";
} else {
print "Plik z imieniem i nazwiskiem zosta utworzony.";
fputs ($plik, "Andrzej Kierzkowski");
fclose ($plik);
}
?>
</BODY>
</HTML>
Zwr uwag na znak @ przed wywoaniem fopen dziki niemu informujesz PHP, e ewentualne bdy w wykonaniu nie maj by wysyane do przegldarki. Po prbie otwarcia pliku dobrym zwyczajem
jest zweryfikowanie, czy operacja si powioda. Czynisz to poprzez
sprawdzenie, czy uchwyt (zmienna $plik) ma ustalon warto. Jeeli
pracujesz w systemie Windows, a program zakoczy dziaanie bdem, najprawdopodobniej nie zaoye katalogu dane lub zaoye
go w zym miejscu (powinien by podkatalogiem tego, w ktrym
znajduje si program z biecego wiczenia). Jeeli program zakoczy dziaanie pomylnie, poszukaj utworzonego pliku i sprawd jego
zawarto.
W I C Z E N I E
4.14
4-14.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Odczytywanie pliku</TITLE>
</HEAD>
112
?>
</BODY>
</HTML>
Pomyl, jak poprawi program, by najpierw sprawdza, czy plik istnieje, a dopiero potem go otwiera.
4.15
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 113
4-15.php
<? // Program odczytuje stron helion.pl i wywietla, podmieniajc kolory.
$plik = fopen ("http://helion.pl", "r");
if (!($plik)) {
print "BD: Nie da si otworzy strony http://helion.pl";
} else {
while (!(feof($plik))) {
$wiersz = (fgets ($plik, h55));
$wiersz = str_replace ('#E4E7ED', '#AhFFB5', $wiersz);
$wiersz = str_replace (' SRC="', ' SRC="http://helion.pl', $wiersz);
print "$wiersz";
}
fclose ($plik);
}
?>
Nie wypisujesz nagwkw HTML, liczc na to, e strona ma swoje. Po odczytaniu przetwarzasz plik wiersz po wierszu, uywajc funkcji feof.
feof
W kadym wierszu dokonujesz dwch operacji: po pierwsze zamieniasz kolor z niebieskawego (#E4E#E4) na zielony (#A2FFB5) a po drugie
poprawiasz adresy wszystkich ilustracji, by zawieray rwnie adres
serwera (w innym przypadku nie byoby ich wida, poniewa program szukaby ich na Twoim serwerze).
Efekt jest ciekawy, cho niebieski kolor komponuje si znacznie
lepiej. Zauwa, e ukad strony si nieco rozsypa. Sprbuj odgadn, co jest tego przyczyn. Przyjrzyj si, jak s odczytywane pliki
z definicjami styli.
114
W I C Z E N I E
4.16
Napisz program, realizujcy prosty licznik tekstowy, ktrego wskazanie jest pamitane w pliku tekstowym. Pamitaj o blokowaniu pliku.
Plik ze wskazaniem licznika zapamitaj w katalogu dane. Program
sprawdzi najpierw, czy plik licznika ju istnieje, a jeli takiego pliku
nie ma, zajmie si jego utworzeniem.
4-16.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Licznik</TITLE>
</HEAD><BODY>
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 115
<? // Program pokazuje dziaanie prostego licznika tekstowego.
if (!(file_exists("dane/liczba.txt"))) { // nie ma pliku z licznikiem
$plik = fopen ("dane/liczba.txt", "w+");
fputs ($plik, "0");
// wic go tworzysz
fclose ($plik);
}
$plik = fopen ("dane/liczba.txt", "r+");
if (!($plik)) {
print "BD: Nie da si otworzy pliku.";
} else {
flock ($plik, h);
$ile = fgets ($plik, h55);
$ile++;
print "Licznik wskazuje $ile.";
fseek ($plik, 0);
fputs ($plik, "$ile");
flock ($plik, 3);
fclose ($plik);
}
?>
</BODY>
</HTML>
116
W wiczeniach przedstawionych do tej pory pliki umieszczano w podkatalogu tego, w ktrym wystpuj dokumenty PHP, co oznacza,
e znajduj si one w drzewie katalogw serwera WWW. Nietrudno
przewidzie, co to oznacza. Zamiast http://localhost/cwphp/4-14.php
wystarczy w przegldarce wpisa adres http://localhost/cwphp/dane/
imienazwisko.txt, a wwczas to, co by moe miao by ukryte, stanie
si cakiem jawne. Niejednokrotnie powane serwisy postpuj w taki
sposb, ujawniajc nawet dane dotyczce swoich klientw. Jeeli koniecznie chcesz przechowywa pliki z informacjami w strukturze
katalogw serwisu, koniecznie zabezpiecz je metod, ktr poznae
w wiczeniu 2.4. Pamitaj jednak, e nie jest to zabezpieczenie bardzo
pewne, dlatego duo lepiej jest umieszcza pliki poza struktur serwisu.
Moesz te utworzy w katalogu plik .htaccess i umieci w nim polecenie 4eny from all, ktre uniemoliwia odczytanie za pomoc serwera
plikw lecych wewntrz. Warto te zwrci uwag, e masz dostp
do caego dysku serwera, ktry jest ograniczony jedynie nadanymi
prawami do katalogw. Aby odwoywa si do pliku, ktry znajduje
si poza struktur serwisu, najlepiej uywaj cieki bezwzgldnej (zaczynajcej si od katalogu gwnego struktury plikw). Moesz wic
prbowa tworzy pliki o nazwach /home/httpd/aki/mojplik.txt (o ile
nadae katalogowi aki odpowiednie prawa) czy C:\usr\apache\plik.txt.
Pomimo faktu, e pliki dyskowe zazwyczaj tworzy si po to, by wymienia informacje pomidzy poszczeglnymi uytkownikami, jest
moliwe atwe utworzenie unikatowego pliku tymczasowego dla jednego uytkownika. W tym celu wykorzystuje si funkcj tempnam.
tempnam
W I C Z E N I E
4.17
Napisz program, ktry bdzie zbiera informacje o uytkowniku, podobnie jak ten
z wiczenia 4.8.
Dane niech bd jednak zbierane w pliku tymczasowym, ktrego
nazwa bdzie przekazywana w ukrytym polu.
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 117
118
?>
</BODY>
</HTML>
Jak widzisz, w ukrytym polu formularza bya przenoszona jedynie informacja o nazwie pliku. Wybrane przez uytkownika towary przechowano w pliku tymczasowym. Aby posprzta po sobie i usun
niepotrzebny ju plik, uye funkcji dnlink.
dnlink Usuwa plik o nazwie podanej jako parametr.
4.18
Losowe przysowie
Napisz program, ktry bdzie wywietla jedno wylosowane przysowie z wielu zapamitanych w pliku tekstowym.
Zacznij od utworzenia pliku tekstowego z przysowiami. Kade zamie w osobnym wierszu.
4-18.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Odczytywanie pliku</TITLE>
</HEAD><BODY>
<? // Program odczytuje plik tekstowy i wywietla losowe przysowie.
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 119
$przyslowia = file ("dane/przyslowia.txt", false);
$przyslowie = chop($przyslowia[rand()%count($przyslowia)]);
print "Przysowie na dzi: <B>\"$przyslowie\"</B>";
?>
</BODY>
</HTML>
Program wczytuje cay plik z przysowiami do tablicy. Nastpnie przeprowadzasz losowanie przysowia (uprzednio poznawszy rozmiar
tablicy). Z wylosowanego przysowia odcinasz znak koca wiersza
(uywajc funkcji chop) i wywietlasz je.
Sesje
Jednym z podstawowych problemw, z ktrymi musi zmierzy si
webmaster w swojej praktyce, jest przenoszenie informacji dotyczcych konkretnego uytkownika pomidzy stronami serwisu. Dobrym
przykadem jest budowa sklepu internetowego, w ktrym z kadym
uytkownikiem jest zwizany koszyk z zamwionymi przez niego towarami. Niezalenie od tego, w ktrym miejscu serwisu znajduje si
osoba, serwis powinien by w stanie wywietli na danie jego zawarto, umoliwi dalsze zakupy czy przejcie do wirtualnej kasy.
120
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 121
122
Przed rozpoczciem pracy z sesjami sprawd w pliku php.ini warto opcji session.sase_path. Okrela ona katalog, w ktrym przechowuje si pliki tymczasowe, dotyczce sesji. Jeeli korzystasz z Krasnala,
domylnie wskazuje ona katalog c:\usr\php5\sesje.
W I C Z E N I E
4.19
Utwrz dwa dokumenty, ktre bd korzysta z mechanizmu sesji i wywietla identyfikator uytkownika.
Nawigacj pomidzy dokumentami umoliwi utworzenie pocze.
Sprawd dziaanie sesji z wczon i wyczon obsug cookies.
Oba dokumenty bd may identyczn tre:
4-19.php, 4-19a.php
<?
session_start();
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje</TITLE>
</HEAD>
<BODY>
<?
print session_id();
?>
<BR><A HREF="4-19.php">4-19</A>, <A HREF="4-19a.php">4-19a</A>
</BODY>
</HTML>
Dziki jej wywoaniu PHP rozpoczyna dla Twoich potrzeb identyfikacj sesji uytkownika (czyli otwiera jego sesj). Jest mu przypisywany unikatowy identyfikator, ktry mona odczyta funkcj session_id.
session_id
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 123
Identyfikacja uytkownika to nie wszystko, co sesje maj nam do zaoferowania. Oprcz tego bardzo atwo mona dla danego uytkownika
pamita pewne istotne wartoci i mie do nich dostp z dowolnej
strony serwisu.
W I C Z E N I E
4.20
session_start();
print session_id();
if (isset($_SESSION['licznik'])) {
$_SESSION['licznik']++;
} else {
$_SESSION['licznik'] = 1;
}
124
W celu sprawdzenia, czy licznik ju zosta zainicjalizowany, wykorzystaj funkcj isset. Jeeli jest to potrzebne, zainicjuj licznik wartoci 1, a w przeciwnym razie zainkrementuj go.
isset
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 125
4.21
session_start();
print session_id();
if (isset($_SESSION['licznik'])) {
$_SESSION['licznik']++;
} else {
$_SESSION['licznik'] = 1;
}
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje, zmienne i plik HTML</TITLE>
</HEAD>
<BODY>
<?
print "<P>Licznik: <B>".$_SESSION['licznik']."</B></P>";
?>
<BR><A HREF="4-h1.php">4-h1</A>, <A HREF="4-h1a.php">4-h1a</A>,
<A HREF="4-h1b.htm">4-h1b -- UWAGA!!!</A>
</BODY>
</HTML>
126
Przed przetestowaniem koniecznie wycz obsug cookies. W przegldarce Internet Explorer konfiguracj cookies znajdziesz po klikniciu
menu Narzdzia/Opcje internetowe i wybraniu zakadki Prywatno.
C si dzieje? Dopki poruszasz si w obrbie skryptw PHP, wszystko dziaa wspaniale. Wystarczy jednak przej poczeniem do pliku
HTML-owego i gubisz wszystkie informacje o uytkowniku. Z adresw stron PHP znika parametr numer sesji. Oczywicie w przypadku, gdy uytkownik akceptuje cookies, w dokumentach PHP zostanie
poprawnie rozpoznany. Wykorzystujc sesje, musisz jednak pamita,
e nie kady korzysta z dobrodziejstw ciastek i stosujc zwyke dokumenty HTML moesz mie kopot.
W rzeczywistoci gubiby dane uytkownika take w kadym skrypcie PHP, ktry nie uywa funkcji session_start. Musisz wic albo
konsekwentnie j stosowa wszdzie, albo po prostu w konfiguracji
(w pliku php.ini) ustawi warto session.adto_start na 1:
session.auto_start
= 1
Pojawia si pytanie, co si dzieje w przypadku przekazywania informacji o sesji w postaci formularzy. Odpowied moe by zaskakujca. Nawet jeeli uytkownik nie akceptuje cookies, do formularzy
s dodawane automatycznie ukryte pola, ktre przenosz informacj o sesji.
W I C Z E N I E
4.22
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 127
Oba skrypty s bardzo podobne, a rni si jedynie metod przekazywania danych POST i GET, a take tablic, z ktrej dane s odczytywane z formularza ($_POST i $_GET).
4-22.php
<?
session_start();
print session_id();
if (isset($_SESSION['licznik'])) { $_SESSION['licznik']++; } else {
$_SESSION['licznik'] = 1; }
?>
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Sesje i formularze - metoda POST</TITLE>
</HEAD>
<BODY>
<?
print "<P>Licznik: <B>".$_SESSION['licznik']."</B></P>";
if ($imie) { print "<P>Wpisane imi: <B>".$_POST['imie'].
"</B></P>"; }
?>
<FORM ACTION="4-hh.php" METHOD="POST">
Wpisz imi: <INPUT TYPE="text" NAME="imie">
<INPUT TYPE=SUBMIT VALUE="Wylij">
</FORM>
<BR><A HREF="4-hh.php">4-hh - Formularz z metod POST</A>
<BR><A HREF="4-hha.php">4-hha - Formularz z metod GET</A>
</BODY>
</HTML>
128
Chocia w poniszych wiczeniach wykorzystano bardzo prosty przykad, wyranie wida, e wykorzystanie sesji w PHP moe okaza si
niezwykle przydatne. Moesz je wykorzysta, nie tylko projektujc
strony e-commerce (koszyk zamwie jest najbardziej typowym przykadem uycia sesji), ale take w licznych innych zastosowaniach.
Baza danych
To ju nieco wysza szkoa jazdy. Projektujc aplikacje webowe, musisz zada sobie pytanie, czy obecna lub przysza ilo informacji, ktre s pamitane, nie powoduje, e powiniene zainteresowa
si baz danych.
Na szczcie nie musisz inwestowa w oprogramowanie. Mimo i
istniej bardzo drogie, komercyjne systemy, s dostpne rwnie mniejsze, darmowe dla celw niekomercyjnych rozwizania, doskonale
sprawdzajce si w maych i rednich serwisach internetowych. Jednym z nich jest MySQL, ktry chyba najczciej bywa czony z PHP,
dlatego zajm si nim w tym rozdziale.
Baza danych jest po prostu pewnym zbiorem informacji. MySQL jest
systemem zarzdzania baz danych (SZBD), ktry umoliwia w atwy
sposb dostp do informacji i ich modyfikacj.
Podstawow jednostk organizacyjn w bazie danych jest tabela. Moesz j sobie wyobrazi jako tablic, w ktrej wierszach s umieszczane rekordy, opisujce pojedyncze obiekty. Poszczeglne kolumny
tabeli opisuj pola danego rekordu, ktre zawieraj odpowiednie dotyczce go informacje. Poniej znajdziesz ilustracj w postaci tablicy
prostej tabeli o nazwie ksiazkatelefoniczna, ktr mgby chcie wykorzysta w swoim systemie do pamitania numerw telefonw swoich
znajomych.
Nr
imie
nazwisko
telefon
Jan
Kowalski
32589442
Adam
Nowak
23423445
Kazimierz
Polak
12387554
Anna
Grska
69666651
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 129
Jeeli zainstalowae Krasnala, MySQL-a masz ju poprawnie skonfigurowanego. Jedyne, co musisz zrobi, to uruchomi program Krasnal
Start z menu Start/Programy/KRASNAL Serv. W przeciwiestwie do
serwera Apache nie zobaczysz wizualnych efektw dziaania MySQL
zainstaluje si jako proces systemowy.
Administracja baz danych jest atwa dziki programowi PHPMyAdmin napisanemu w PHP systemowi administracji baz danych.
Ten program take masz w swoim systemie, pora wic rozpocz
dziaanie.
W I C Z E N I E
4.23
Uruchom program PHPMyAdmin. Utwrz now baz danych o nazwie cwphp, a w niej
tabel ksiazkatelefoniczna.
Aby uruchomi program PHPMyAdmin, pocz si z adresem http://
localhost/phpmyadmin (powiniene mie ju uruchomiony serwer
Apache i MySQL-a). Krasnal zabezpiecza baz przed niepowoanym
dostpem uyj nazwy uytkownika root i hasa krasnal. Ukae si
okienko programu administracyjnego. W celu zaoenia nowej bazy
danych wpisz jej nazw w odpowiednim polu i kliknij przycisk Utworzenie (rysunek 4.1). Utwrz wic baz o nazwie cwphp.
Po utworzeniu bazy danych pojawi si ona w lewej ramce. Jeeli utworzysz jakie tabele, bd widoczne po rozwiniciu gazi bazy danych.
Przystp do tworzenia tabeli. Odpowiednie pole znajduje si w dolnej
czci prawej ramki. W okrelonych polach formularza wpisz nazw
tabeli (ksiazkatelefoniczna) i liczb kolumn w tabeli, czyli pl rekordu.
W Twoim przypadku jest to 4. Spjrz na ilustracj 4.2, by zobaczy,
jak przebiega proces zakadania tabeli w bazie.
Po klikniciu przycisku Wykonanie pojawia si okno, w ktrym naley
okreli pola tabeli (rysunek 4.3). Pola imie, nazwisko i telefon bd typu tekstowego. W kolumnie Pole formularza nadaj odpowiednie nazwy.
Jako Typ wybierasz TEXT. Poniewa nie chcesz, by pola mogy mie pust warto, w kolumnie Ndll okrelasz warto not ndll.
130
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 131
132
4.24
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 133
4.25
134
Jeeli bdziesz usuwa i wprowadza dane do tabeli, zauwaysz szybko, e liczba porzdkowa (pole nr) nie bdzie stanowia spjnej numeracji od 1 do liczby rekordw, lecz pojawi si dziury. Nie naley
si tym martwi tak wanie ma by. Warto przypomnie sobie, do
czego jest potrzebne to pole. Nie dlatego, by numerowa rekordy, lecz
by opatrzy je indeksem unikatowym, staym dla danego rekordu i nieopatrzonym histori to znaczy niezwizanym z innym, uprzednio
usunitym rekordem.
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 135
klienta, pozostawiajc kwesti administracji temu programowi. Docelowo jednak powiniene utworzy dla swojego serwisu wasny modu
administracyjny, w ktrym wedle wasnego uznania bdziesz mg
dba o dane serwisu.
Administracja baz danych MySQL za pomoc programu PHPMyAdmin okazaa si bardzo atwa. Pamitaj jednak, e baza zostaa
zaoona w celu wykorzystania na stronach WWW.
Zajcie si baz danych z poziomu PHP nie jest trudne. Za pomoc PHP
masz moliwo pozyskiwania informacji z bazy danych, dodawania
nowych, usuwania niepotrzebnych, a nawet dokonywania czynnoci
administracyjnych, takich jak zakadanie nowych baz danych, tworzenie tabel i ich modyfikacja itd. By moe zwrcie uwag, e
PHPMyAdmin jest faktycznie aplikacj napisan w PHP. Ju widziae
jego potne moliwoci. To, co byo moliwe za jego pomoc, mniejszym lub wikszym nakadem pracy moesz zaprogramowa za pomoc PHP.
W I C Z E N I E
4.26
Jest to nic innego, jak zapytanie do bazy danych, nakazujce wywietli wszystkie pola z tablicy ksiazkatelefoniczna dla pierwszych 30
rekordw. Dziki wydaniu bazy danych takiego polecenia otrzymae wynik wiczenia 4.25.
Sprbuj zrealizowa to samo za pomoc wasnego programu PHP.
136
4-26.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Czytanie z bazy danych</TITLE>
</HEAD>
<BODY>
<? // Odczyt z bazy danych skada si z przyczenia si do MySQL,
// wybrania bazy danych, zadania pytania SQL i przetworzenia
wynikw.
mysql_connect ("localhost", "root", "krasnal") or
die ("Nie mona poczy si z MySQL");
mysql_select_db ("cwphp") or
die ("Nie mona poczy si baz cwphp");
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;") or
die ("bd w pytaniu");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD></TR>\n";
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko</TD>";
print "<TD>$telefon</TD></TR>\n";
}
print "</TABLE>";
?>
</BODY>
</HTML>
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 137
Oznacza ona wykonanie funkcji, a w przypadku niepowodzenia zakoczenie dziaania programu z odpowiednim komunikatem. Przy
funkcjach operujcych na bazie danych wykorzystaj t konstrukcj,
by w przypadku niepowodzenia wiedzie, co si dzieje, i nie wykonywa dalej niepotrzebnych operacji.
Nastpnie naley wybra baz danych, uywajc funkcji mysql_
select_do. Wybierasz cwphp.
mysql_select_do
Po zadaniu zapytania mona ju odczytywa jego wyniki. Jedn z typowych metod jest ptla:
while ($rekord = mysql_fetch_assoc ($wynik)) {
operacje na rekordzie
}
Ptla odczytuje kolejne rekordy, ktre s wynikiem zapytania, zapisujc je w tablicy $rekord. Komrki tej tablicy zawieraj kolejne pola
wynikw zapytania, dostp do nich jest moliwy za pomoc nazw kolumn tabeli uytych jako klucze tablicy.
138
4.27
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 139
if ($_GET['co'] == 'skasuj') {
$wynik = mysql_query
("DELETE FROM ksiazkatelefoniczna WHERE nr = '".$_GET
['id']."';");
}
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;") or
die ("bd w pytaniu");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD><TD></TD></TR>\n";
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko
</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h7.php?co=skasuj&id=$nr\">skasuj
</A></TD></TR>\n";
}
print "</TABLE>";
?>
</BODY>
</HTML>
Jeeli przed wywietleniem danych skrypt rozpozna, e naley przeprowadzi usuwanie danych, uruchamia usuwajce zapytanie SQL.
Po jego realizacji s wywietlane pozostae rekordy.
Skoro umiesz ju dane przeglda i usuwa, pora nauczy si je dopisywa. Pomoe w tym SQL-owe zapytanie w postaci:
INSERT INTO nazwa_tabeli (spis_pl) VALUES (wartoci);
140
W I C Z E N I E
4.28
Popraw skrypt z poprzedniego wiczenia tak, by umoliwia rwnie dodawanie nowych rekordw.
Pod wywietlon zawartoci bazy przygotujesz formularz z moliwoci wpisania nowego rekordu. W ukrytym polu ustaw zmienn co
(bdzie okrela operacj, w przypadku dopisywania rekordu dodaj).
Dopisywanie jest realizowane jedynie wtedy, gdy kade z trzech pl
zostanie wypenione (nie chcesz mie przecie niekompletnej ksiki
telefonicznej).
4-28.php
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-h">
<TITLE>Czytanie z bazy danych, usuwanie i dodawanie rekordw</TITLE>
</HEAD>
<BODY>
<? // Dodawanie rekordu zrealizowano za pomoc zapytania INSERT.
// Dane s wczytywane w przygotowanym formularzu.
mysql_connect ("localhost", "root", "krasnal") or
die ("Nie mona poczy si z MySQL");
mysql_select_db ("cwphp") or
die ("Nie mona poczy si z baz cwphp");
if ($_POST['co'] == 'dodaj') {
// dodawanie rekordu
if ($_POST['imie'] && $_POST['nazwisko'] && $_POST['telefon']) {
$query = "INSERT INTO ksiazkatelefoniczna (imie, nazwisko, ";
$query .= "telefon) VALUES ('".$_POST['imie']."', '".$_POST
['nazwisko']."',
'".$_POST['telefon']."');";
$wynik = mysql_query ($query);
}
} elseif ($_GET['co'] == 'skasuj') { // usuwanie
$wynik = mysql_query
("DELETE FROM ksiazkatelefoniczna WHERE nr = '".$_GET
['id']."';");
}
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;") or
die ("bd w pytaniu");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD><TD></TD></TR>\n";
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 141
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h8.php?co=skasuj&id=$nr\">skasuj
</A></TD></TR>\n";
}
print
print
print
print
print
print
print
print
print
?>
"</TABLE>";
'<FORM METHOD="POST">Nowy rekord:';
'<INPUT TYPE="hidden" NAME="co" VALUE="dodaj"><TABLE>';
'<TR><TD>Imi:</TD><TD><INPUT TYPE="text" ';
'NAME="imie"></TD></TR><TR><TD>Nazwisko:</TD><TD><INPUT ';
'TYPE="text" NAME="nazwisko"></TD></TR>';
'<TR><TD>Telefon:</TD>';
'<TD><INPUT TYPE="text" NAME="telefon"></TD></TR>';
'</TABLE><INPUT TYPE="submit" VALUE="Dodaj"></FORM>';
</BODY>
</HTML>
4.29
142
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 143
$query .= "'".$_POST['nazwisko']."', telefon='".$_POST
['telefon']."' WHERE
nr='".$_POST['id']."';";
$wynik = mysql_query ($query);
}
} elseif ($_GET['co'] == 'edytuj') { // przygotowanie do poprawek
$query = "SELECT * FROM ksiazkatelefoniczna where nr='".$_GET
['id']."';";
$wynik = mysql_query ($query);
$rekord = mysql_fetch_assoc ($wynik);
$nr = $rekord['nr']; $imie = $rekord['imie']; $nazwisko =
$rekord['nazwisko'];
$telefon = $rekord['telefon'];
print '<FORM METHOD="POST">Poprawa rekordu:';
print '<INPUT TYPE="hidden" NAME="co" VALUE="popraw">';
print '<INPUT TYPE="hidden" NAME="id" VALUE="'.$nr.'"><TABLE>';
print '<TR><TD>Imi:</TD><TD><INPUT TYPE="text" ';
print 'NAME="imie" VALUE="'.$imie.'"></TD></TR><TR><TD>Nazwisko:';
print '</TD><TD><INPUT TYPE="text" NAME="nazwisko"';
print 'VALUE="'.$nazwisko;
print '"></TD></TR><TR><TD>Telefon:</TD><TD><INPUT TYPE="text"';
print 'NAME="telefon" VALUE="'.$telefon.'"></TD></TR>';
print '</TABLE><INPUT TYPE="submit" VALUE="Popraw"></FORM>';
} elseif ($_GET['co'] == 'skasuj') { // usuwanie
$wynik = mysql_query
("DELETE FROM ksiazkatelefoniczna WHERE nr = '".$_GET
['id']."';");
}
$wynik = mysql_query ("SELECT * FROM ksiazkatelefoniczna;");
print "<TABLE CELLPADDING=5 BORDER=1>";
print "<TR><TD><B>Imi</B></TD><TD><B>Nazwisko</B></TD>";
print "<TD><B>Telefon</B></TD><TD></TD><TD></TD></TR>\n";
while ($rekord = mysql_fetch_assoc ($wynik)) {
$nr = $rekord['nr'];
$imie = $rekord['imie'];
$nazwisko = $rekord['nazwisko'];
$telefon = $rekord['telefon'];
print "<TR><TD>$imie</TD><TD>$nazwisko</TD><TD>$telefon</TD><TD>";
print "<A HREF=\"4-h9.php?co=skasuj&id=$nr\">skasuj</A></TD><TD>";
print "<A HREF=\"4-h9.php?co=edytuj&id=$nr\">edytuj</A></TD>
</TR>\n";
}
print
print
print
print
print
"</TABLE>";
'<FORM METHOD="POST">Nowy rekord:';
'<INPUT TYPE="hidden" NAME="co" VALUE="dodaj"><TABLE>';
'<TR><TD>Imi:</TD><TD><INPUT TYPE="text" ';
'NAME="imie"></TD></TR><TR><TD>Nazwisko:</TD><TD><INPUT ';
144
Jeeli chciaby, by wywietlane dane byy uporzdkowane wzgldem nazwiska, wystarczy, e poprawisz nieco zapytanie wybierajce
wszystkie dane na nastpujc posta:
SELECT * FROM ksiazkatelefoniczna ORDER BY nazwisko;
}
...
R o z d z i a 4 . D a n e p o b i e r a n i e , p r z e k a z y w a n i e i p r z e c h o w y w a n i e 145
stripslashes
Zapytania SQL-owe mog mie bardzo rozbudowan tre. Mog odwoywa si do kilku tabel i wykonywa na danych skomplikowane
operacje.
Jeeli w przyszoci bdziesz mia wtpliwoci, czy w rozwizaniu
problemu wykorzysta mechanizmy bazy danych, czy te oprogramowa je na piechot, wykonujc na bazie jedynie prost operacj,
146