You are on page 1of 45

IDZ DO

PRZYK£ADOWY ROZDZIA£
SPIS TRECI

KATALOG KSI¥¯EK
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG

TWÓJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMÓW INFORMACJE
O NOWOCIACH
ZAMÓW CENNIK

CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE

PHP i MySQL.
Dynamiczne strony
WWW. Szybki start
Autor: Larry Ullman
T³umaczenie: Micha³ Dadan (rozdz. 1 – 7),
Piotr Pilch (rozdz. 8 – 13, dod. A – D)
ISBN: 83-7361-157-6
Tytu³ orygina³u: PHP and MySQL for Dynamic Web Sites VQPG
Format: B5, stron: 580
Przyk³ady na ftp: 352 kB
Coraz wiêcej serwisów internetowych sk³ada siê nie tylko z atrakcyjnego interfejsu
u¿ytkownika, ale tak¿e z rozbudowanych aplikacji dzia³aj¹cych na serwerze. S¹ one
najczêciej oparte o bazy danych, które przechowuj¹ dane i zapewniaj¹ szybki do nich
dostêp. Jeli chcesz w krótkim czasie nauczyæ siê tworzyæ takie aplikacje, znalaz³e
w³aciw¹ ksi¹¿kê.
„PHP i MySQL. Dynamiczne strony WWW” nauczy Ciê tworzenia dynamicznych
serwisów internetowych z wykorzystaniem PHP i MySQL-a. Ksi¹¿ka przeka¿e Ci wiedzê
niezbêdn¹ dla projektantów rozwi¹zañ internetowych. Wszystkie zagadnienia opisane
s¹ „krok po kroku”, ka¿demu z nich towarzyszy te¿ odpowiedni rysunek. Przyk³ady
odzwierciedlaj¹ problemy, z którymi projektanci stron internetowych spotykaj¹ siê
na co dzieñ.
Ksi¹¿ka opisuje:
• Podstawy programowania w PHP
• Tworzenie dynamicznych stron internetowych z u¿yciem PHP
• Zasady projektowanie baz danych
• Jêzyk SQL
• Korzystanie z systemu zarz¹dzania bazami danych MySQL
• £¹czenie PHP z systemem MySQL
• U¿ycie sesji
• Zabezpieczanie stron internetowych przed dostêpem nieuprawnionych osób
• Przyk³adowe aplikacje: rejestracja u¿ytkowników i sklep internetowy
Treæ ksi¹¿ki uzupe³niaj¹ dodatki opisuj¹ce sposób instalacji omawianych w niej
narzêdzi oraz dodatkowe, przydatne aplikacje.

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Jeli chcesz w szybko nauczyæ siê programowania dynamicznych serwisów
internetowych, ta ksi¹¿ka bêdzie Twoim intensywnym kursem. Ju¿ po przeczytaniu
kilku rozdzia³ów bêdziesz w stanie pisaæ pierwsze programy w PHP korzystaj¹ce z bazy
MySQL, a po przeczytaniu ca³ej ksi¹¿ki poradzisz sobie równie¿ z tworzeniem bardziej
rozbudowanych aplikacji.

Spis treści

Spis treści

Wprowadzenie
9
Czym są dynamiczne strony WWW?........................................................10
Czym jest PHP?.........................................................................................11
Co to jest MySQL?....................................................................................14
Co będzie Ci potrzebne .............................................................................16
O tej książce ..............................................................................................16
Wprowadzenie do PHP
19
Podstawy składni.......................................................................................20
Przesyłanie danych do przeglądarki internetowej .....................................23
PHP, HTML i „białe odstępy” ..................................................................26
Wstawianie komentarzy ............................................................................31
Co to są zmienne? .....................................................................................34
Łańcuchy ...................................................................................................37
Liczby........................................................................................................41
Stałe...........................................................................................................45
Apostrof kontra cudzysłów .......................................................................48

Rozdział 2.

Programowanie w PHP
51
Tworzenie formularza w języku HTML ..................................................52
Obsługa formularza HTML.......................................................................56
Zarządzanie opcją Magic Quotes ................................................................59
Wyrażenia warunkowe i operatory............................................................61
Weryfikacja danych pochodzących z formularza......................................65
Ręczne przesyłanie wartości do skryptu ...................................................69
Co to są tablice? ........................................................................................74
Pętle for i while .........................................................................................92

5

Spis treści

Rozdział 1.

Spis treści

Tworzenie dynamicznych stron WWW
95
Wykorzystywanie plików zewnętrznych...................................................96
Tworzenie i wywoływanie własnych funkcji ..........................................105
Zasięg zmiennej.......................................................................................115
Wyświetlanie i obsługa formularza przez jeden skrypt.............................118
Wysyłanie poczty elektronicznej...............................................................122
Nagłówki HTTP ......................................................................................125
Tworzenie formularzy z pamięcią...........................................................130
Funkcje daty i czasu ................................................................................133

Rozdział 4.

Wprowadzenie do SQL i MySQL
137
Projektowanie tabel .................................................................................138
Korzystanie z monitora mysqla...............................................................142
Tworzenie baz danych i tabel..................................................................146
Wprowadzanie rekordów ........................................................................149
Wybieranie danych..................................................................................152
Wyrażenia warunkowe ............................................................................154
Stosowanie LIKE i NOT LIKE ..............................................................158
Sortowanie wyników zapytania .................................................................160
Ograniczanie wyników zapytania ...........................................................163
Uaktualnianie danych ..............................................................................165
Usuwanie danych ....................................................................................167

Rozdział 5.

Zaawansowany SQL i MySQL
169
Projekt bazy danych ................................................................................170
Złączenia .................................................................................................185
Funkcje ....................................................................................................189
Indeksy ....................................................................................................201

Rozdział 6.

PHP i MySQL
205
Tworzenie szablonu.................................................................................206
Łączenie się z MySQL-em i wybieranie bazy.........................................211
Obsługa błędów.......................................................................................215
Wykonywanie prostych zapytań ................................................................218
Odczytywanie wyników zapytania..........................................................228
Bezpieczeństwo.......................................................................................232
Korzystanie z funkcji mysql_num_rows() ..............................................238
Uaktualnianie rekordów w PHP ................................................................244

Spis treści

Rozdział 3.

6

Spis treści

Rozdział 7.

Sesje i „ciasteczka”
251
Posługiwanie się ciasteczkami ................................................................252
Sesje ........................................................................................................271
Sesje a „ciasteczka”.................................................................................287

Rozdział 8.

Zabezpieczenia
295
Autoryzacja HTTP ..................................................................................296
Walidacja formularza przy użyciu skryptu JavaScript .............................302
Wyrażenia regularne ...............................................................................309
Zabezpieczenia bazy danych ...................................................................321

Rozdział 9.

Tworzenie aplikacji internetowych
325
Metody debugowania kodu źródłowego skryptu PHP ............................326
Metody debugowania zapytań SQL i serwera MySQL...........................329
Obsługa błędów w języku PHP.................................................................335
Obsługa błędów serwera MySQL..............................................................339
Zwiększanie wydajności aplikacji internetowych ...................................342

Rozdział 11. Zarządzanie zawartością strony — przykład
377
Tworzenie szablonu.................................................................................378
Tworzenie zwykłych stron internetowych ..............................................383
Zarządzanie adresami URL .....................................................................385
Zarządzanie plikami ................................................................................402
Rozdział 12. Rejestrowanie użytkowników — przykład
417
Tworzenie szablonów..............................................................................418
Tworzenie skryptów konfiguracyjnych...................................................422
Tworzenie strony głównej .......................................................................428
Rejestracja ...............................................................................................430
Logowanie i wylogowywanie się ..............................................................440
Zarządzanie hasłami ................................................................................446
Część administracyjna aplikacji ..............................................................457
7

Spis treści

Rozdział 10. Zagadnienia dodatkowe
347
Buforowanie wyjścia...............................................................................348
Buforowanie stron HTML.......................................................................355
Określanie typu przeglądarki internetowej.............................................357
Skrypty PHP i JavaScript ........................................................................361
Zastosowanie pakietu PEAR ...................................................................369

Spis treści

Spis treści

Rozdział 13. Sklep internetowy — przykład
473
Tworzenie bazy danych...........................................................................474
Część administracyjna aplikacji ..............................................................478
Tworzenie szablonu części publicznej aplikacji......................................491
Katalog produktów ..................................................................................495
Koszyk zakupów .....................................................................................504
Dodatek A

Instalacja
515
Instalacja pod systemem Windows............................................................516
Definiowanie uprawnień serwera MySQL..............................................522
Sprawdzanie poprawności instalacji ......................................................528

Dodatek B

Aplikacje dodatkowe
531
Narzędzie phpMyAdmin .........................................................................532
Systemy szablonów .................................................................................533
Oprogramowanie obsługujące fora dyskusyjne.......................................534
Zarządzanie zawartością..........................................................................535
Handel elektroniczny...............................................................................536
Wyszukiwarki..........................................................................................537
Biblioteki kodów źródłowych .................................................................538

Dodatek C

Odsyłacz
539
Język PHP ...............................................................................................540
Serwer MySQL .......................................................................................547

Dodatek D

Zasoby internetowe
553
Język PHP ...............................................................................................554
Serwer MySQL .......................................................................................557
Język SQL ...............................................................................................559
Zabezpieczenia ........................................................................................560
Inne strony internetowe ...........................................................................561
Skorowidz

8

565

Zarządzanie zawartością strony — przykład

Zarządzanie zawartością
strony — przykład

Rozdział 11. Zarządzanie zawartością strony — przykład

Pierwszy przykład aplikacji zamieszczony w niniejszej
książce będzie dotyczył zarządzania zawartością strony.
Aplikacja będzie zarządzała zarówno adresami URL,
jak i plikami, które użytkownicy będą mogli dodawać,
wyświetlać i przetwarzać. Co prawda w tym przypadku
nie zostanie uwzględniona administracyjna część aplikacji,
ale zostaną dołączone informacje pozwalające na jej
wykonanie.

377

Zarządzanie zawartością strony

Chociaż w tym rozdziale skupimy się na konkretnym
przykładzie, to jednak wspomnimy również o kilku
nowych funkcjach i metodach. Do funkcji tych należy
zaliczyć   
i  . Wspomnimy także,
w jaki sposób zrealizować operację umieszczania plików
na serwerze.

Rozdział 11.

Tworzenie szablonu
W pierwszym etapie projektowania aplikacji
zostanie utworzony systemowy szablon,
którego zadaniem będzie wspomaganie procesu
przygotowywania strony HTML. Strona
w ostatecznej postaci (rysunek 11.1)
będzie korzystała z tabel i kilku arkuszy
stylów CSS (ang. Cascading Style Sheets).

Aby utworzyć plik naglowek.html,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nową stronę

Tworzenie szablonu

HTML (listing 11.1). 
  

å  

!" "#  $ 

%&''''#()*

å) + **,

å+   !" "# - -.  

+  !/ %&''''#(000+ 
å+ & (/1  
(/1 . 
1-. 

1 
%123"4/5# 1  6%1
5# 1 /

å 1+  7
5 !1 /"!#8890* 
. 
" 1.:% %
15 #
;%(1< " 17
:. " 1.

1. Napisać kod arkusza stylów CSS. 
! 61
6%1/ 1+ 5!!
1-"/!511 .
=#-6
>
=5?(#3 -5##&
@AAAAAA7
B 
5# 1
>

=5?(#3 -5##&
@A9A9A97

%--" ( #%& 
%+7
%--" ("( & 
%+7

å%--" (=# # & 
%+7
%--" (1A & 
%+7

å ("  #%& 
%+7 
(" "( & 
%+7

å (" =# # & 
%+7 
(" 1A & 
%+7
B

378

Rysunek 11.1. Domyślny wygląd strony
aplikacji omawianej w tym rozdziale

Zarządzanie zawartością strony — przykład
Listing 11.1. Plik naglowek.html rozpoczyna się od kodu formatującego stronę HTML i zawiera wymagany
kod arkusza stylów CSS

379

Tworzenie szablonu  

     

!" "#  $
* 

%&''''#()*) + **,+   !" "# - -.   

+  !/ %&''''#(000+ 
+ & (/1  
(/1 .
C 

1-.
9 

1 
%123"4/5# 1  6%1
5# 1 / 1+  7
5 !1 /"!#8890* 
.
, 

" 1.:% %
15 #
;%(1< " 17
:. " 1.
D 

! 61
6%1/ 1+ 5!!
1-"/!511 .
8

=#-6
>
=5?(#3 -5##&
@AAAAAA7
B
0 

5# 1
> 

=5?(#3 -5##&
@A9A9A97 

%--" ( #%& 
%+7
%--" ("( & 
%+7
%--" (=# # & 
%+7
%--" (1A & 
%+7 
* 

("  #%& 
%+7 
(" "( & 
%+7 
(" =# # & 
%+7 
(" 1A & 
%+7 

B 
C 

4" ?&" ?
>
5##&
@,,7
1+ -15# "# &
# 17
B 
9 

4" ?&4"!" 1-
>
5##&
@,,7
1+ -15# "# &
# 17
B 
, 

4" ?& #41
>
5##&
@5555557
1+ -15# "# &
# 17
B 
D

-
> 
8

A# A "6&
E1- F
G"F 
141 "5F
! !!1"A7
A# !"H1& 
%+7 
0

41 "5"( &
#%7
*

B
* 

" 1
>
**

A# !"H1&
*C%+7
A# '1"( &
# 7
5##&
@AAAAAA7
* 

("  #%&
9%+7 
(" =# # &
9%+7 
(" 1A &
*%+7
*C

%--" ( #%&
9%+7
%--" (=# # &
9%+7
%--" (1A &
*%+7
*9

B
*, 

! 61.
*D 

1-.
*8 

=#-6.
*0   

=1
'"- /0I
=#-1/
51!%5" (/
51%--" (/ 

"( /51 1.   

. 
* 

-
5#!% /*
=(5##/@,,.%
5!!/ " 1.JHK-H "1
H' #L5"K
! # %. -.   

. 
C  

. 
9 

-
4"( / #%
#'%/ #'%. 
, 

=. 
1A/" -1+% %
5!!/ 4" ?.M # 
(NO' .= 
. 
D  

1A/4"1'<3!% %
5!!/ 4" ?.H1(K-P 
-1!6 
).= 
. 
8  

1A/--<3% %
5!!/ 4" ?.#-P 
-1! 
).= 
. 
0  

1A/4"1'<A"1!% %
5!!/ 4" ?.H1(K-P
%"?".= 
.
C  

1A/--<A"1% %
5!!/ 4" ?.#-P
%"?.=.
C 

-.
C*
C 

-
4"( / #%
5!!/5# 1 .
CC  

"! " (  

(#'1?  
.

Rozdział 11.

Tworzenie szablonu 

4" ?&" ?
>
5##&
@,,7
å 1+ -15# "# &
# 17
B 
4" ?&4"!" 1-
>
5##&
@,,7
å 1+ -15# "# &
# 17
B 
4" ?& #41
>
5##&
@5555557
å 1+ -15# "# &
# 17
B
-
>

A# A "6&
E1- F
G"F 
141 "5F

å! !!1"A7
A# !"H1& 
%+7

41 "5"( &
#%7
B 
" 1
>

A# !"H1&
*C%+7
A# '1"( &

å # 7
5##&
@AAAAAA7 

("  #%&
9%+7 
(" =# # &
9%+7

å (" 1A &
*%+7

%--" ( #%&
9%+7
%--" (=# # &
9%+7

å%--" (1A &
*%+7
B 
! 61.

W przypadku omawianej aplikacji zostanie
wykorzystany arkusz stylów CSS, który
posłuży do sformatowania tekstu. Ze względu
na niewielką objętość kodu arkusza stylów
CSS, zamiast w oddzielnym pliku zostanie
on umieszczony bezpośrednio w sekcji 
strony HTML.
3. Zakończyć pisanie kodu nagłówka strony

HTML i utworzyć pierwszy wiersz tytułu. 
1-. 
=#-6.  
=1
'"- /0I
=#-1/
å51!%5" (/
51%--" (/
å"( /51 1.  

. 

-
5#!% /*
=(5##/@,,.

å%
5!!/ " 1.JHK-H "1

åH' #L5"K
! # %. -.  

.  

.

Podstawowa strona HTML będzie zawierała
tabelę złożoną z trzech wierszy — tytułu,
wiersza przechowującego odnośniki
i zawartość strony oraz wiersza, w którym
będą umieszczone informacje o prawach
autorskich (rysunek 11.2).

380

Rysunek 11.2. Wygląd strony, na której w celu
wyróżnienia wierszy i kolumn tabeli zastosowano
obwódki

Zarządzanie zawartością strony — przykład
4. Utworzyć sekcję powiązaną z odnośnikami

i rozpocząć definiowanie komórek
przechowujących zawartość strony. 
-
4"( / #%
#'%/ #'%. 
=. 
1A/" -1+% %
5!!/
å 4" ?.M # 
(NO' .= 
.  

1A/4"1'<3!% %
å5!!/ 4" ?.H1(K-P 
-1!6
å).= 
.  

1A/--<3% %
5!!/
å 4" ?.å#-P 
-1! 
).= 
.  

1A/4"1'<A"1!% %
5!!/
å 4" ?.H1(K-P
%"?".= 
.  

1A/--<A"1% %
å5!!/ 4" ?.#-P
%"?.=. 
-. 
-
4"( / #%
5!!/5# 1 .  

"! " (  

(#'1?  
.

5. Zapisać plik pod nazwą naglowek.html

i umieścić go na serwerze WWW
(w katalogu includes).
Na rysunku 11.3 przedstawiono strukturę
katalogów zawierających pliki aplikacji.
Wskazówka 
W przykładzie zamieszczonym w następnym

przykładzie zostanie zastosowany bardziej
złożony arkusz stylów CSS, który będzie
zapisany w oddzielnym pliku dołączonym
do pliku naglowek.html.

381

Tworzenie szablonu

Rysunek 11.3. Struktura aplikacji internetowej,
której katalogiem głównym jest katalog html

Rozdział 11.

Aby utworzyć plik stopka.html,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nową stronę

HTML (listing 11.2).  

"! " ( 
* 

! #%?  
.

2. Zakończyć kod środkowego wiersza tabeli. 

-.  

.

Cała zawartość strony będzie przechowywana
w środkowym wierszu tabeli, którego
definicja zaczyna się w pliku naglowek.html.
Powyższy kod kończy definicję wiersza,
po którym zostanie umieszczony trzeci
i ostatni wiersz.
3. Zdefiniować ostatni wiersz i zakończyć

Tworzenie szablonu

tworzenie strony HTML.  

. 

-.Q =!%7 -. 

- 
"( /51 1.Q5#%67
* 
6


å  
-  

!"( !F 
5 -.  

.  
=1. 
=#-6.  
.

4. Zapisać plik pod nazwą stopka.html

i umieścić go na serwerze WWW
(w katalogu includes).

382

Listing 11.2. Plik stopka.html zawiera pozostałe
definicje wyglądu strony HTML   

"! " ( 
* 

! #%?  
.
* 

R# "15
H' #L5"
! # 6 
.  

-.
C  

.
9
,  

.
D 

-.Q =!%7 -.
8 

- 
"( /51 1.Q5#%67

* 
6
  
-  

!"( !F 
5 -.
0  

.    

=1. 
* 

=#-6.   

.

Zarządzanie zawartością strony — przykład
Listing 11.3. Główna strona aplikacji
(w razie potrzeby należy umieścić na niej
bardziej wartościowe informacje)

Zanim zajmiemy się najważniejszą częścią
aplikacji internetowej (samym mechanizmem
zarządzania zawartością stron) konieczne będzie
stworzenie jeszcze dwóch stron HTML. Jedna
z nich o nazwie index.php będzie spełniała rolę
głównej strony aplikacji. Z kolei druga o nazwie
mysql_connect.php jest skryptem, którego
zadaniem jest połączenie z serwerem MySQL
i wybranie wymaganej bazy danych (w celu
uzyskania dodatkowych informacji na jej temat
należy zapoznać się z zawartością ramki Schemat
bazy danych zawartej w następnym podrozdziale).

Aby utworzyć główną stronę,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP

(listing 11.3). 
:% %
@ 
"! " (  

" -1+% %

2. Określić tytuł strony i dołączyć plik

nagłówka HTML.
;%(1< " 1
/
TJHK-H "1
H' #L5"K
å! # T7
" 53-1<# 51
UT" 53-1! (#'1? TV7
:.

Rysunek 11.4. Główna strona

3. Wypełnić stronę tekstem. 

%.M%
!%
!%
!%
!%
!%
!%

å!%
!%
!% %. 

%.M%
!%
!%
!%
!%
!%
!%

å!%
!%
!% %.

Co prawda posłużyłem się tego typu treścią
(słowo ), ale oczywiście na stronie
głównej można umieścić bardziej wartościowe
informacje.
4. Dołączyć stopkę HTML. 
:% %
" 53-1<# 51
UT" 53-1!! #%? TV7
:.

5. Zapisać plik pod nazwą index.php, umieścić go

na serwerze WWW i przetestować przy użyciu
przeglądarki internetowej (rysunek 11.4).
383

Tworzenie zwykłych stron internetowych  

:% %
@ 
"! " (  

" -1+% %
* 

SNO' 
! # 
!1'1    

! '"1 "1
6 3N3
! # 6

"
-#NK5H1 "1
(NO'? 

C

;%(1< " 1
/
TJHK-H "1

H' #L5"K
! # T7
9

" 53-1<# 51

UT" 53-1! (#'1? TV7
,

:.
D 

%.M%
!%
!%
!%
!%
!%

!%
!%
!%
!% %.
8 

%.M%
!%
!%
!%
!%
!%

!%
!%
!%
!% %.
0 

:% %  

#NK5H1 "1
! #%?"  

" 53-1<# 51
UT" 53-1!! #%? TV7 

:.

Tworzenie zwykłych
stron internetowych

Rozdział 11.

Aby utworzyć skrypt
mysql_connect.php,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP

(listing 11.4). 
:% %
@ 
"! " ( 
C 

6!2<5# 15 % %

Tworzenie zwykłych stron internetowych

Skrypt jest taki sam jak jego poprzednie wersje
wykorzystane w poprzednich rozdziałach
(z wyjątkiem nazwy użytkownika i jego hasła
oraz konfiguracji bazy danych). Skrypt może
zostać stworzony od podstaw lub poprzez
odpowiednią modyfikację poprzedniej wersji.
2. Określić konfigurację bazy danych w postaci

stałych.
-1A"
-1A"
-1A"
-1A"

1
UT<M )TF
T3!1  1TV7
1
UT<GMM)TF
T%!!'#-TV7
1
UT<MTF
T#5 #! TV7
1
UT<$G TF
T5# 1 TV7

Mając na względzie kwestię zabezpieczeń
użytkownik łączący się z serwerem MySQL
powinien na potrzeby omawianej aplikacji
dysponować możliwością wykonywania tylko
takich poleceń jak , , 
i dodatkowo wyłącznie dla bazy danych
content.

Listing 11.4. Skrypt łączy z serwerem MySQL
i wybiera bazę danych content  

:% %
@ 
"! " ( 
C 
6!2<5# 15 % %
*  

%"?3
H' #
% 1 6

'6 ( 1
-#
3H6!? "
-#! W%3

-#
=H6
- 65  
"?
P1!

3X6' 6 
?X1
%H6
NK5H1 "3
!"W

H
!1'11 
6MY
"
'6="1 "1

=H6
- 65 
C  

! '"1 "1
P?#
! N65

% 1 O'
3-H"1PK565
-#! W%3

-#
=H6
- 65 
9

-1A" 1
UT<M )TF
T3!1  1TV7
,

-1A" 1
UT<GMM)TF

T%!!'#-TV7
D

-1A" 1
UT<MTF
T#5 #! TV7
8

-1A" 1
UT<$G TF
T5# 1 TV7
0 

$'"KH "1
%#NK5H1 "

H
!1'11
"
'6= "1
=H6
- 65  

;-=5
/
Z 6!2<5# 15
U<MF 

<M )F 
<GMM)V 
)
-"1

UT$"1
=6N#
#X"'1
%#NK5H1 "1

H
!1'11 
6MY&
T 

6!2<1#UV
V7 

6!2<!115 <-=
U<$G V 
)
-"1

UT$"1
=6N#
#X"'1
'6= "1
=H6

- 65 &
T 

6!2<1#UV
V7 
*

:.

3. Połączyć się z serwerem MySQL i wybrać

bazę danych.
;-=5
/
Z 6!2<5# 15
U<MF 
<M )F
å<GMM)V 
)
-"1
UT$"1
=6N#
#X"'1
å%#NK5H1 "1
H
!1'11 
6MY&
T 

å 6!2<1#UV
V7
6!2<!115 <-=
U<$G V 
)
-"1
åUT$"1
=6N#
#X"'1
'6= "1
=H6
- 65 &
T
å
å 6!2<1#UV
V7

Aplikacja dysponuje podstawowym
mechanizmem obsługi błędów realizowanym
przez funkcję   

. Więcej
informacji na ten temat zawarto w rozdziale 6.
4. Zakończyć skrypt PHP.
:.

5. Zapisać plik pod nazwą mysql_connect.php

i umieścić go na serwerze WWW poza
katalogiem głównym (rysunek 11.3).
384

Wskazówki 
W następnym rozdziale zostanie omówiony

przykład, w którym zostaną wykorzystane
bardziej zaawansowane metody obsługi
błędów. Poza tym zamieszczono w nim
zmodyfikowaną wersję skryptu
mysql_connect.php. 
W celu uzyskania dodatkowych informacji

na temat praw dostępu do serwera MySQL
należy zapoznać się z zawartością dodatku A.

Zarządzanie zawartością strony — przykład

Zarządzanie adresami URL
Kolejne dwie strony HTML, które zostaną
stworzone, umożliwią użytkownikom dodawanie
adresów URL i przeglądanie już dołączonych.
Ta część aplikacji bazuje na trzech tabelach
bazy danych —  
,   
 i    
.
Aby uzyskać dodatkowe informacje, należy
zapoznać się z zawartością ramki Schemat
bazy danych.

Dodawanie adresów URL

W celu określenia wartości pola    dla
dodanego adresu URL zostanie wykorzystana
funkcja   
, która do tej pory
nie była omawiana. Każdorazowo, gdy na tabeli
zawierającej pole o automatycznie zwiększanej
wartości (zazwyczaj jest nim klucz główny)
zostanie wykonane zapytanie, wtedy dla pola
serwer MySQL użyje następnej wartości.
Funkcja   
zwróci tę wartość.
W przeciwnym razie nie byłoby możliwe jej
uzyskanie.

385

Zarządzanie adresami URL

Skrypt add_url.php prawdopodobnie jest
najbardziej złożonym wśród wszystkich
wchodzących w skład aplikacji. Wynika to
z zastosowania znormalizowanej struktury
bazy danych. Formularz zawarty w skrypcie
pobiera adres URL, jego tytuł (lub nazwę), opis
i maksymalnie trzy kategorie. Po wypełnieniu
formularza (adres URL, jego tytuł, opis) dane
zostaną umieszczone w tabeli    
.
Następnie w celu dodania do tabeli  

od jednego do trzech rekordów (w zależności
od ilości kategorii wybranych przez użytkownika)
zostanie zastosowany klucz główny tabeli  
 wraz z wartościami pola   .

Rozdział 11.

Schemat bazy danych

Zarządzanie adresami URL

W niniejszym rozdziale zastosowano bazę danych o nazwie content, którą utworzono
w rozdziale 5. W tamtym rozdziale zdefiniowano trzy znormalizowane tabele na potrzeby
obsługi adresów URL (złożona struktura pozwala na zaklasyfikowanie adresów URL
do wielu typów). W tym rozdziale zostanie stworzona tabela   wykorzystywana
przy zarządzaniu plikami. Całkowita struktura bazy danych może zostać ponownie
zdefiniowana z wykorzystaniem poniższych poleceń: 

) G 
G
3%#-!
U3%#-<"-
"
UV 
$MS$ 
$
$
G<$)  $F

åA"1<  1
EG)G)UV
$
$F
A"1<!"H1 
$U,V 
$MS$ 
$
$F
A"1< 6%1

åEG)G)UV
$
$F
-1!5"% "#
EG)G)UV 
[G
$F
3%#-<- 1

åG 
$
$F 
)G)
R 
U3%#-<"-VF
R 
A"1<  1
UA"1<  1VV7 

) G 
G
3< " 1!
U " 1<"-
MG$UCV 
$MS$ 
$
$
G<$)  $F

å3
EG)G)U,V
$
$F
" 1
EG)G)U,V
$
$F
-1!5"% "# 
$ 
$

å$F 
)G)
R 
U " 1<"-VF 
$Y
R 
3
U3VV7 

) G 
G
3< 6%1!
U 6%1<"- 
$$UV 
$MS$ 
$
$
G<$)  $F

å 6%1
EG)G)U*V
$
$F 
)G)
R 
U 6%1<"-VF 
$Y
R 
6%1
U 6%1VV7 

) G 
G
3!
U3<"-
MG$UCV 
$MS$ 
$
$
G<$)  $F

å " 1<"-
MG$UCV 
$MS$ 
$
$F
6%1<"- 
$$UV 
$MS$ 
$
$F

å%%#41- 
G)UV 
[G
T$TF
- 1<!3= " 1- 
MGUCV
$
$F 
)G)

åR 
U3<"-VF
R 
" 1<"-
U " 1<"-VF
R 
6%1<"-
U 6%1<"-VF
R 

å- 1<!3= " 1-
U- 1<!3= " 1-VV7

W celu sprawdzenia struktury bazy danych zawsze można użyć poniższych poleceń języka SQL
(rysunek 11.5).

M 
G M7 

M)
nazwa_tabeli7

Rysunek 11.5. Sprawdzenie struktury bazy danych

386

Zarządzanie zawartością strony — przykład

Aby utworzyć skrypt add_url.php,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt

PHP (listing 11.5). 
:% %
@ 
"! " ( 
9  

--<3% %
;%(1< " 1
/
T#-' "1 
-1!O' 
)T7
" 53-1
UT" 53-1! (#'1? TV7 
123"1<# 51
UT 6!2<5# 15 % %TV7

2. Sprawdzić, czy formularz został wypełniony
i zastosować funkcję     .

3. Przeprowadzić walidację wprowadzonego

adresu URL i jego tytułu.

"A
U1 % 6U;<M\T3T]VV
>

;3
/
1!5%1<- U;<M\T3T]V7

B
1!1
>

;3
/
[GM 7

15 #
T%.A#
5##/1-.#!HW
%#-^

å-1! 
)A# .%.T7

B

"A
U1 % 6U;<M\T " 1T]VV
>

;
/
1!5%1<- U;<M\T " 1T]V7

B
1!1
>

;
/
[GM 7

15 #
T%.A#
5##/1-.

å#!HW
%#-^
H'W 
-1!3

å) " 1A# .%.T7
B

Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych  

:% %
@ 
"! " ( 
9  

--<3% %
* 

M # 
%#H'
3X6 ?#' "?#
-#-^ 
-1!6 
)
-#
=H6
- 65    

! '"1 "1
6 3N3
! # 6
"
-#NK5H1 "1
(NO'? 

C

;%(1< " 1
/
T#-' "1 
-1!O' 
)T7
9

" 53-1
UT" 53-1! (#'1? TV7
, 

123"1<# 51
UT 6!2<5# 15 % %TV7  

#NK5H1 "1
H
=HK
- 65 
D

"A
U"!!1 U;<M\T!3= " T]VV
>  

=!N3(
A# 3H
8 

[3 ?5P
3!3'PK5
H ?
TT
"
#=5" PK5
- 1
'%#'-H# 1
'
A# 3H3
0

A3 5 "#
1!5%1<- 
U;- V
> 

(#=
;-=57 

"A
U" "<(1 UT ("5<23# 1!<(%5TVV
> 
*

;- 
/
! "%!! 1!U;- V7 

B 
C 

1 3
6!2<1<1!5%1<! " (
U "
U;- VF
;-=5V7 
9

B 

R# "15
!1?5P"
A3 ?5P"
1!5%1<- UV

387

Zarządzanie adresami URL

"A
U"!!1 U;<M\T!3= " T]VV
>
å 
=!N3(
A# 3H

A3 5 "#
1!5%1<- 
U;- V
>

(#=
;-=57

"A
U" "<(1 UT ("5<23# 1!<(%5TVV
>

;- 
/
! "%!! 1!U;- V7

B 

1 3
6!2<1<1!5%1<! " (

åU "
U;- VF
;-=5V7

B

Podobnie jak w poprzednich rozdziałach,
funkcja      gwarantuje poprawność
przesyłanych danych niezależnie od tego, czy
uaktywniono funkcję Magic Quotes, czy nie.

Rozdział 11.
W tym przykładzie zostanie dokonane
sprawdzenie, czy wprowadzono wartości.
W celu zwiększenia dokładności można
oczywiście zastosować wyrażenia proste
(tak naprawdę w rozdziale 8. zawarto skrypt
przeprowadzający walidację adresów URL).
Jeśli jakieś pole nie zostanie wypełnione,
pojawi się komunikat błędu widoczny
na rysunku 11.6.
4. Sprawdzić, czy w polu   

podano wartość.

Zarządzanie adresami URL

"A
U1 % 6U;<M\T-1!5"% "# T]VV
>

;-
/
1!5%1<- 

åU;<M\T-1!5"% "# T]V7

B
1!1
>

;-
/
TT7
B

Rysunek 11.6. Jeśli użytkownik nie poda adresu
URL lub jego tytułu, zostanie wyświetlony
komunikat błędu

Ze względu na to, że w polu   

tabeli    
 nie trzeba wstawiać wartości,
będzie ona przetwarzana, ale tylko wtedy,
gdy zostanie wprowadzona w formularzu.
Jeśli w polu   
nie zostanie
wstawiona żadna wartość, zmiennej 
stosowanej w zapytaniu będzie przypisywany
pusty łańcuch.
Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy 
, 

M%'-H1 "1 
-1!3 
) 
D

"A
U1 % 6U;<M\T3T]VV
> 
8

;3
/
1!5%1<- U;<M\T3T]V7 
0

B
1!1
>
*

;3
/
[GM 7
*

15 #
T%.A#
5##/1-.#!HW
%#-^ 
-1! 
)A# .%.T7
B
** 

M%'-H1 "1
H'6 
-1!3 
)
*

"A
U1 % 6U;<M\T " 1T]VV
>
*C

;
/
1!5%1<- U;<M\T " 1T]V7
*9

B
1!1
>
*,

;
/
[GM 7
*D

15 #
T%.A#
5##/1-.#!HW
%#-^
H'W 
-1!3 
) " 1A# .%.T7

B
*8 

M%'-H1 "1
' #L5"
%#
-1!5"% "#
U "1
P1!
'6 ( 1V
*0

"A
U1 % 6U;<M\T-1!5"% "# T]VV
> 

;-
/
1!5%1<- U;<M\T-1!5"% "# T]V7 

B
1!1
>

;-
/
TT7
B

388

Zarządzanie zawartością strony — przykład
5. Sprawdzić wybraną kategorię.

"A
UU;<M\T 6%1T]
. 
V 
)

åU;<M\T 6%1*T]
. 
V 
)

åU;<M\T 6%1T]V
. 
V
>

; 6%1
/ 
) 7

B
1!1
>

; 6%1
/
[GM 7

15 #
T%.A#
5##/1-.

å#!HW
%#-^
5#
P "1P
P1- K

å? 1(#"WA# .%.T7

B

Rysunek 11.7. Użytkownik musi wybrać co najmniej
jedną kategorię dla wprowadzonego adresu URL

Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy 
* 

M%'-H1 "1
? 1(#"" 

"A
UU;<M\T 6%1T]
. 
V 
)
U;<M\T 6%1*T]
. 
V 
)
U;<M\T 6%1T]V
.V
> 
C

; 6%1
/ 
) 7 
9

B
1!1
> 
,

; 6%1
/
[GM 7 
D

15 #
T%.A#
5##/1-.#!HW
%#-^
5#
P "1P
P1- K
? 1(#"WA# .%.T7
B 
8

"A
U;3
QQ
;
QQ
; 6%1V
> 

_1L"
'!H6! ?#
P1!
'
%#HK-?3 
0  

#-' "1 
-1!3 
)
-# 
=1"
3< " 1!
C

;2316
/ 
$M ) 
$
3< " 1!
U3F
" 1F
-1!5"% "# V
EG M

UT;3TFT; TF
T;-TV7
C

;1!3
/
Z 6!2<2316
U;2316V7  

6?#  "1
H%6  "
C*

; "-
/
Z 6!2<" !1 <"-UV7  

#= "1
"-1 6A"? #
6 3N3
C
CC

"A
U; "-
. 
V
> 

_1L"
H#! N#
'6?#  1
%'"-N#'#
C9  

'#H1 "1
H%6  "
C,

;2316
/
T$M ) 
$
3!
U " 1<"-F
6%1<"-F 
%%#41-F
- 1<!3= " 1-V
EG M
T7
CD

"A
U;<M\T 6%1T]
. 
V
>
C8

;2316 
/ 
U; "-F
>;<M\T 6%1T]BF
TTF
$UVVF 
7
B

389

Zarządzanie adresami URL

Użytkownik, mając do dyspozycji zbiór
typów zawartych w tabeli   
, może
przypisać wprowadzanemu adresowi URL
maksymalnie trzy kategorie. Zakłada się,
że użytkownik wybierze kategorię przy
użyciu pierwszego menu rozwijanego
(  ). Niezależnie od tego instrukcja
warunkowa sprawdzi, czy skorzystano
z przynajmniej jednego menu rozwijanego.
Jeśli tak nie będzie, zostanie wyświetlony
komunikat błędu (rysunek 11.7).

Rozdział 11.
6. Dodać adres URL do tabeli    
.

Zarządzanie adresami URL

"A
U;3
QQ
;
QQ
; 6%1V
>  

#-' "1 
-1!3 
)
-# 
=1"

å3< " 1!

;2316
/ 
$M ) 
$
3< " 1!
U3F

å " 1F
-1!5"% "# V
EG M
UT;3TF

åT; TF
T;-TV7

;1!3
/
Z 6!2<2316
U;2316V7

; "-
/
Z 6!2<" !1 <"-UV7

Ze względu na strukturę bazy danych, adres
URL musi zostać dodany do tabeli    

zanim będzie możliwa modyfikacja tabeli  

. Powyższe zapytanie doda adres URL,
a następnie przy użyciu funkcji  
 
zwróci wartość pola   
(klucz główny tabeli o automatycznie
zwiększanej wartości). Uzyskana wartość
może następnie zostać wykorzystana
w drugim zapytaniu (krok 7.).

7. Utworzyć główne zapytanie.

"A
U; "-
. 
V
>

;2316
/
T$M ) 
$
3!

åU " 1<"-F
6%1<"-F 
%%#41-F

å- 1<!3= " 1-V
EG M
T7

"A
U;<M\T 6%1T]
. 
V
>

;2316 
/ 
U; "-F

å>;<M\T 6%1T]BF
TTF

å$UVVF 
7

B

"A
U;<M\T 6%1*T]
. 
V
>

;2316 
/ 
U; "-F
>;<M

å\T 6%1*T]BF
TTF
$UVVF 
7

B

"A
U;<M\T 6%1T]
. 
V
>

;2316 
/ 
U; "-F

å>;<M\T 6%1T]BF
TTF

å$UVVF 
7

B

;2316
/
!3=! 
U;2316F 
F 
*V7

Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
C0

"A
U;<M\T 6%1*T]
. 
V
>
9

;2316 
/ 
U; "-F
>;<M\T 6%1*T]BF
TTF
$UVVF 
7

B
9

"A
U;<M\T 6%1T]
. 
V
>
9*

;2316 
/ 
U; "-F
>;<M\T 6%1T]BF
TTF
$UVVF 
7
9

B
9C

;2316
/
!3=! 
U;2316F 
F 
*V7  

!3 "W5"1
#!  "1(#
%H15" ?
"
!%5P"
99  

6?#  "1
H%6  "
9,

;1!3
/
Z 6!2<2316
U;2316V7
9D

"A
U;1!3 V
>
98

15 #
T%.=.H"W?3P1 6
H
%H1!N "1
- 65 =.%.T7
90

;<M
/ 
6UV7
,

B
1!1
> 

_1L"
'6! K%"K
%#=1 6
,

15 #
T%.A#
5##/1-.$
!?3 1?
=NW-3
!6! 1 #'1(#
'6!N 1
H%6  "1
"1
#(N#

H#! ^
%H1 '#H# 1 
H1%!H 6
H
H"! "NK
"1-#(#- #L^A# .%.T7
,*

B
,

B
1!1
> 

_1L"
'6! K%"K
%#=1 6
,C

15 #
T%.A#
5##/1-.$
!?3 1?
=NW-3
!6! 1 #'1(#
'6!N 1
H%6  "1

"1
#(N#
H#! ^
%H1 '#H# 1 
H1%!H 6
H
H"! "NK
"1-#(#- #L^A# .%.T7
,9

B

390

Zarządzanie zawartością strony — przykład
Jeśli zostanie pobrana wartość zmiennej   ,
bez obaw można przejść do wykonywania
głównego zapytania (dodanie rekordu do
tabeli  
). Aby tak postąpić, na początku
należy zdefiniować zapytanie i przypisać
jego początkową część zmiennej  
.
Po sprawdzeniu, czy wybrano kategorie
(przy użyciu menu rozwijanych), dla każdej
z nich dodano rekord przy użyciu zapytania.
Na końcu w celu usunięcia z zapytania
ostatnich dwóch znaków (przecinek i znak
spacji) zostanie użyta funkcja ! 
.
Jeśli wystąpią problemy ze składnią zapytania
należy nakazać interpreterowi języka PHP
wyświetlenie wartości zmiennej  
,
dzięki czemu można stwierdzić, co będzie
przetwarzane przez serwer MySQL.

8. Wykonać zapytanie, wprowadzić komunikaty

informujące o jego wyniku i uzupełnić
instrukcje warunkowe.

;1!3
/
Z 6!2<2316
U;2316V7

"A
U;1!3 V
>

15 #
T%.=.H"W?3P1 6
H

å%H1!N "1
- 65 =.%.T7

B
1!1
> 

_1L"
'6! K%"K
%#=1 6

15 #
T%.A#
5##/1-.

å$
!?3 1?
=NW-3
!6! 1 #'1(#

å'6!N 1
H%6  "1
"1
#(N#

åH#! ^
%H1 '#H# 1

åH1%!H 6
H
H"! "NK

å "1-#(#- #L^A# .%.T7

B

Powyższe instrukcje warunkowe
wyświetlą odpowiednie komunikaty
związane z przesyłanymi danymi.

Zarządzanie adresami URL

Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
,,

B
1!1
> 

_1L"
P1- 
H
#%15P"
!%'-H1 "
- 65
!"W
"1
%#'"1-H"1
,D

15 #
T%.A#
5##/1-.#!HW
!%O=#'^
%# #' "1A# .%.T7
,8

B
,0

B 

R# "15
" ! 3?5P"
'3 ?#'1P
#=!N3(3PK51P
- 1
'%#'-H 1
'
A# 3H3
D  

[# 3H
'6L'"1 PK56
- 1
D  

'#H1 "1
1 3 
#H'"P 1(#
D*

;2316
/ 
M  
`
[)
3< 6%1! 
) ) 

6%1
GM7
D

;1!3
/
Z 6!2<2316
U;2316V7
DC

;%3-#'
/
T#% "# .6="1H
P1- K
%#H65PW#% "# .T7
D9

' "1
U;#'
/
6!2<A1 5 <6
U;1!3 F 
MY<GMMVV
>
D,

;%3-#' 
/ 
#% "#
431/a>;#'\T 6%1<"-T]Ba.>;#'\T 6%1T]B#% "# .a 7
DD

B
D8

:.
D0 

A# 
5 "# /:% %
15 #
;<M )E )\T<M [T]7
:.
1 #-/%#! .
8 

A"1-!1 .1(1 -.
513
%H1!N " 
-1!3 
)
1X6
'6%1N "^
A# 3H

U #X 
'6=^ 
?!6  "1 

? 1(#"1V&1(1 -.
8 

%.=.G-1! 
)&=. 
" %3
6%1/ 1+ 
 1/3
!"H1/, 
+1 ( /,

431/:% %
"A
U"!!1 U;<M\T3T]VV
15 #
;<M\T3T]7
:. 
.=
8* 

.! .$"1
-#NK5HP
"-1 6A"? # 
". %&".! .%.
8

B
1!1
>
8C

15 #
T%.A#
5##/1-.$
!?3 1?
=NW-3
!6! 1 #'1(#
'6!N 1
H%6  "1

"1
#(N#
H#! ^
%H1 '#H# 1 
H1%!H 6
H
H"! "NK
"1-#(#- #L^A# .%.T7
89

B
8,

B
1!1
>
8D

15 #
T%.A#
5##/1-.#!HW
!%O=#'^
%# #' "1A# .%.T7
88

B
80

B

391

Rozdział 11.
9. Utworzyć stronę HTML, na której zostaną

umieszczone menu rozwijane umożliwiające
wybranie typu adresów URL.
;2316
/ 
M  
`
[)
3< 6%1! 
) ) 

å 6%1
GM7
;1!3
/
Z 6!2<2316
U;2316V7
;%3-#'
/
T#% "# .6="1H
P1- K
å%#H65PW#% "# .
T7
' "1
U;#'
/
6!2<A1 5 <6
U;1!3 F
åMY<GMMVV
>

;%3-#' 
/ 
#% "#

å431/a>;#'\T 6%1<"-T]Ba.>;#'

å\T 6%1T]B#% "# .a 7
B

Zarządzanie adresami URL

Listing 11.5. Skrypt pozwala użytkownikom przesyłać adresy URL do bazy danych — ciąg dalszy
0 

%.=.$H' 6 3N 
-1!3 
)&=. 
" %3
6%1/ 1+ 
 1/ " 1
!"H1/, 

+1 ( /,
431/:% %
"A
U"!!1 U;<M\T " 1T]VV
15 #
;<M\T " 1T]7
:. 
.%.
0
0* 

%.=.%"!&=. 
1+ 1
 1/-1!5"% "# 
5#!/C 
#'!/9.:% %
"A

U"!!1 U;<M\T-1!5"% "# T]VV
15 #
;<M\T-1!5"% "# T]7
:. 1+ 1.%.
0
0C 

%.=.R 1(#" 
&=. 
!115
 1/ 6%1.
09 

:% %
15 #
;%3-#' 7
:.
0, 

!115 .%.
0D
08 

%.=.R 1(#"
*&=. 
!115
 1/ 6%1*.
00 

:% %
15 #
;%3-#' 7
:.  

!115 .%.  

* 

%.=.R 1(#" 
&=. 
!115
 1/ 6%1.  

:% %
15 #
;%3-#' 7
:. 
C 

!115 .%. 
9 
, 

A"1-!1 . 
D 
8 

-"4 
"( /51 1." %3
6%1/!3= " 
 1/!3= " 
431/6L"P 
.-"4. 
0  

A# .
R# "15
A# 3H.  

:% % 
*

6!2<5#!1UV7 

J ? "W5"1
%#NK5H1 "
H
=HK
- 65  

" 53-1
UT" 53-1!! #%? TV7  

#NK5H1 "1
! #%?"  

C

:.

392

Zarządzanie zawartością strony — przykład
Formularz będzie zawierał trzy menu rozwijane,
z których każde będzie dysponowało listą
dostępnych typów adresów URL pobranych
z bazy danych. Ze względu na to, że zależy
mi na wyświetleniu trzech kopii tego typu
informacji, bardziej efektywnym będzie
przypisanie wyników zmiennej niż wielokrotne
wysyłanie zapytania do bazy danych.
Na rysunku 11.8 pokazano kod źródłowy
strony zawierającej menu rozwijane.
10. Utworzyć formularz na stronie HTML. 
A# 
5 "# /:% %
15 #
;<M )E )\T<M [T]7
:.
1 #-/%#! . 
A"1-!1 .1(1 -.
513
%H1!N " 
-1!3
å)
1X6
'6%1N "^
A# 3H
U #X 
å'6=^ 
?!6  "1 

? 1(#"1V&1(1 -. 

%.=.$H' 6 3N 
-1!3 
)&=. 
" %3
å 6%1/ 1+ 
 1/ " 1
!"H1/,
å +1 ( /,
431/:% %
"A
åU"!!1 U;<M\T " 1T]VV
15 #
å;<M\T " 1T]7
:. 
.%. 
%.=.%"!&=. 
1+ 1
 1/-1!5"% "# 
å5#!/C 
#'!/9.:% %
"A
åU"!!1 U;<M\T-1!5"% "# T]VV
15 #
å;<M\T-1!5"% "# T]7
:. 1+ 1.%. 
%.=.R 1(#" 
&=. 
!115
 1/ 6%1. 
:% %
15 #
;%3-#' 7
:. 
!115 .%. 
%.=.R 1(#"
*&=. 
!115
 1/ 6%1*. 
:% %
15 #
;%3-#' 7
:. 
!115 .%. 
%.=.R 1(#" 
&=. 
!115
 1/ 6%1. 
:% %
15 #
;%3-#' 7
:. 
!115 .%. 
A"1-!1 . 
-"4 
"( /51 1." %3
6%1/!3= " 
å  1/!3= " 
431/6L"P 
.-"4. 
A# .

393

Zarządzanie adresami URL

Rysunek 11.8. Kod źródłowy strony HTML
dynamicznie generujący menu rozwijane 

%.=.G-1! 
)&=. 
" %3
6%1/ 1+ 
å  1/3
!"H1/, 
+1 ( /,
å431/:% %
"A
U"!!1 U;<M\T3T]VV
å15 #
;<M\T3T]7
:. 
.=
å.! .å$"1
-#NK5HP
"-1 6A"? #
å". %&".! .%.

Rozdział 11.
Formularz (rysunek 11.9) pozwala wprowadzić
do pól tekstowych kilka wartości i zapamiętać je.
11. Zakończyć skrypt PHP. 
:% %
6!2<5#!1UV7
" 53-1
UT" 53-1!! #%? TV7
:.

12. Zapisać plik pod nazwą add_url.php, umieścić

go na serwerze WWW i przetestować przy użyciu
przeglądarki internetowej (rysunek 11.10).

Zarządzanie adresami URL

Rysunek 11.9. Formularz służący do dodawania
adresów URL

Rysunek 11.10. Po przesłaniu wprowadzonych
danych zostanie wyświetlony komunikat
i formularz będzie widoczny ponownie
(z poprzednio wstawionymi wartościami)

394

Zarządzanie zawartością strony — przykład
Wskazówki 
W celu zablokowania możliwości

stosowania znaczników języka HTML
we wprowadzanych wartościach należy
posłużyć się funkcją   
" .
Funkcja ta usuwa wszystkie znaczniki
nie tylko języka HTML, ale też PHP. 
Aby wyświetlić znaczniki języka HTML

(w postaci, w jakiej występują w kodzie
źródłowym) bez ich uaktywniania należy
skorzystać z funkcji #  #  

i #      . 
Funkcja   
jest powiązana

też stworzyć kontrolki, które posłużyłyby
do wybierania maksymalnie trzech kategorii. 
Po uaktywnieniu funkcji Magic Quotes,

wartości wprowadzone do formularza przed
przesłaniem do przeglądarki muszą zostać
przetworzone przez funkcję  
#  . 
W przytoczonym przykładzie po poprawnym

przesłaniu wstawionych wartości formularz
zostanie ponownie wyświetlony wraz
z poprzednio wprowadzonymi danymi.
Aby to zmienić, należy zrezygnować
z wyświetlania formularza lub wyczyścić
zawartość zmiennej tablicowej %&
po udanym wykonaniu zapytania na bazie
danych. 
Funkcja języka PHP o nazwie  

jest odpowiednikiem funkcji  

oferowanej przez serwer MySQL. 

W przypadku korzystania ze skryptów

PHP i stron HTML można stosować
rozwiązanie zapamiętujące, jakie pozycje
zostały wybrane z menu rozwijanego,
ale jest to związane z większą ilością kodu
źródłowego, a ponadto w przytoczonym
przykładzie niezbyt dobrze współpracuje
ze zmienną  $.

395

Zarządzanie adresami URL

z każdą pojedynczą sesją (interakcja z bazą
danych). Z tego też powodu nie należy
się przejmować tym, że zwrócono
nieprawidłową wartość nawet wtedy,
gdy skrypt jednocześnie został wykonany
przez kilku różnych użytkowników. 

W zastosowanym przykładzie można było

Rozdział 11.

Przeglądanie wysłanych adresów URL

Zarządzanie adresami URL

Skrypt umożliwiający przeglądanie adresów URL
będzie się składał z dwóch części — górnej
i dolnej. W pierwszej z nich zostanie wyświetlone
menu rozwijane z dostępnymi typami adresów,
natomiast w drugiej wszystkie odnośniki dla
wybranego typu. Gdy użytkownik wyświetli
stronę po raz pierwszy, wtedy nie zostanie
wyświetlony żaden adres URL. Po wybraniu
przez niego typu i przesłaniu danych
wprowadzonych do formularza, strona zostanie
wyświetlona ponownie wraz z listą adresów
URL dla wybranego typu (niezależnie
od tego menu rozwijane w dalszym ciągu
będzie widoczne).

Nowe funkcje i metody
Skrypt view_urls.php wprowadza dwa nowe rozwiązania. Jednym z nich jest rzutowanie,
czyli narzucanie zmiennej konkretnego typu (całkowitoliczbowy, łańcuchowy itp.).
Aby zrzutować zmienną, należy przed jej nazwą w nawiasach określić ostateczny jej typ.
Oto przykład:

;4
/ 
7 
6%
Nb535 #'6

;4
/
U" V;47 
6%
5N?#'" #"5H=#'6

Do dostępnych typów zmiennych (w niektórych przypadkach wiele określeń dotyczy tego
samego typu) należy zaliczyć takie typy jak  i  "
, ! i ! , ' , ! ,

,  
",  

i !(  . Interpreter języka PHP w oparciu o początkową wartość
rzutowanej zmiennej zmieni jej typ i przypisze jej odpowiadającą mu wartość logiczną
(w celu uzyskania szczegółowych informacji z tym związanych należy zajrzeć do
dokumentacji języka PHP). Przy użyciu funkcji  )  można też zmienić typ zmiennej
na typ całkowitoliczbowy (co zostanie pokazane w kolejnym skrypcie). Z kolei poprzez
umieszczenie wartości w znakach cudzysłowu można zamienić typ zmiennej na łańcuchowy.
Drugim nowym rozwiązaniem zastosowanym w skrypcie jest funkcja  . Funkcja
pobiera wartości zmiennej tablicowej i przypisuje je oddzielnym zmiennym. Oto przykład:

;4
/ 
6
U_ F 
$#'?V7 

"!
U;A"! F
;! V
/
;47

Powyższym zmiennym ' 
i  zostaną przypisane odpowiednio wartości Jan i Nowak.
Podobna funkcjonalność może być również uzyskana przy użyciu funkcji *  
podobnej
do funkcji  .

396

Zarządzanie zawartością strony — przykład

Aby utworzyć skrypt view_urls.php,
należy wykonać poniższe kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP

(listing 11.6). 
:% %
@ 
"! " ( 
, 

4"1'<3!% %
;%(1< " 1
/
TH1(K- "1 
-1!O' 
)T7
" 53-1<# 51
UT" 53-1! (#'1? TV7 
123"1<# 51
UT 6!2<5# 15 % %TV7

Rysunek 11.11. Menu rozwijane

2. Rozpocząć definiowanie formularza

zawartego na stronie HTML.
15 #
T-"4 
"( /51 1. 
A#
1 #-/(1  
5 "# /4"1'<3!% %. 
!115
 1/ 6%1. 
#% "#
431/$.6="1H
å? 1(#"W&#% "# .
T7

Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii  

:% %
@ 
"! " ( 
, 

4"1'<3!% %
* 

M # 
%#H'
'6L'"1 "^ 
-1!6 
)
H%"! 1
'
=H"1
- 65    

! '"1 "1
6 3N3
! # 6
"
-#NK5H1 "1
(NO'? 

C

;%(1< " 1
/
TH1(K- "1 
-1!O' 
)T7
9

" 53-1<# 51
UT" 53-1! (#'1? TV7
, 

123"1<# 51
UT 6!2<5# 15 % %TV7  

#NK5H1 "1
H
=HK
- 65 
D  

'#H1 "1
A# 3H
%#H'PK51(#
3X6 ?#' "?#'"
'6= "1 
-1!3 
)F

? O6
H#!  "1
'6L'"1 # 6
8 

0   
     

 
! "#   $%&  
*'

397

Zarządzanie adresami URL

Po pierwszym wyświetleniu strony HTML
będzie na niej widoczny formularz składający
się z menu rozwijanego i przycisku Wyślij
(rysunek 11.11). W tym miejscu zawarto
początek definicji formularza umieszczonego
na stronie HTML.

Rozdział 11.
3. Pobrać wszystkie dostępne typy adresów URL

i dołączyć je do menu rozwijanego.
;2316
/
TM  
`
[)
3< 6%1!
å) ) 

6%1
GMT7
;1!3
/
6!2<2316
U;2316V7
' "1
U;#'
/
6!2<A1 5 <6
åU;1!3 F 
MY<$VV
>

15 #
T#% "#
431/TF
;#'\]F
T.TF

å! "%!! 1!U;#'\]VF
T#% "# .
T7
B

Zarządzanie adresami URL

Powyższy kod pobiera z tabeli   

każdy typ adresu URL i na podstawie
zwróconych rekordów generuje kod źródłowy
menu rozwijanego umieszczonego na stronie
HTML (rysunek 11.12).

Rysunek 11.12. Dynamicznie wygenerowany kod
źródłowy formularza zawartego na stronie HTML

Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii — ciąg dalszy 
&&(!   )   $* 
C+,-../012345 436.3789-/' 
9+ , ,:+,;' 
, :+,   :+ <58-=5;;> 
D  
<+?@A<<  :+?BA;<&  
8' 
0C
*
*&&D #E"  " 
**& 
* !  !  
) FG
*C&
*9& 

*,'
*D
*8  

#= "1 
-1!O' 
)
#?1L# 1(#
6%3
UP1L"
(#
%#- #V
*0

"A
U"!!1 U;<S \T 6%1T]VV
>  

;
/
" 4U;<S \T 6%1T]V7 

M%'-H1 "1F
5H6
6%
P1!
5N?#'" #"5H=#'6 
*   

#= "1
H'6 
? 3 "1
'6= 1(#
6%3 
C

;2316
/ 
M  
6%1
[)
3< 6%1! 
)
6%1<"-/; 7 
9

;1!3
/
6!2<2316
U;2316V7 
, 

"!
U; 6%1V
/
6!2<A1 5 <6
U;1!3 F 
MY<$V7 
D 
8

15 #   

.-"4 
"( /a51 1a.=.; 6%1
#- #L "?O'=.= 
. 
0 

! .U!H6! ?"1
#- #L "?"
=W-K
?#H6! N6
H
'N! 1(#
#? 
$P%"1'

H#!  K
'6L'"1 # 1
#!  "#
-#- 1
#- #L "?"V! .-"4.a 7

398

Zarządzanie zawartością strony — przykład
4. Zakończyć definicję formularza

umieszczonego na stronie HTML.
15 #
T!115 . 
" %3
6%1/!3= " 
 1/!3= " 
å431/6L"P. 
A# . 
-"4.
T7

5. Sprawdzić, czy został wybrany typ adresu

URL i czy pobrano informacje na jego temat.
"A
U"!!1 U;<S \T 6%1T]VV
>

;
/
" 4U;<S \T 6%1T]V7

15 #   

.-"4

å"( /a51 1a.=.; 6%1

å#- #L "?O'=.= 
. 
! .U!H6! ?"1
#- #L "?"
=W-K
å?#H6! N6
H
'N! 1(#
#? 
$P%"1'
åH#!  K
'6L'"1 # 1
#!  "#
-#- 1
å#- #L "?"V! .-"4.a 7

Pierwsza operacja będzie polegała
na zastosowaniu funkcji  )  w celu
sprawdzenia, czy wybrany typ, który zostanie
zastosowany w zapytaniu jest typem
całkowitoliczbowym. W dalszej kolejności
przy użyciu funkcji   zostanie pobrana
nazwa typu i wyświetlona na stronie w roli
nagłówka. Więcej informacji na temat funkcji 
)  i   można znaleźć w ramce
Nowe funkcje i metody lub w dokumentacji
języka PHP.
6. Zainicjalizować zmienną ' 
i wysłać

zapytanie do bazy danych.
;A"!
/ 
) 7
;2316
/ 
M  
3F
" 1F
-1!5"% "#
å[)
3!
GM
3F
3< " 1!
GM
3 
)
å3  " 1<"-
/
3 " 1<"-
G$
3 6%1<"-/;
åG$
3%%#41-
/
TT 
) ) 

å- 1<!3= " 1-
-1!57
;1!3
/
6!2<2316
U;2316V7

Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii — ciąg dalszy
C

;A"!
/ 
) 7  

"5P"H5P
H "1 1P
C  

6?#  "1
H%6  "

=H"1
- 65 
C*

;2316
/ 
M  
3F
" 1F
-1!5"% "#
[)
3!
GM
3F
3< " 1!
GM
3 

)
3  " 1<"-
/
3 " 1<"-
G$
3 6%1<"-/;
G$
3%%#41-
/
TT 

) ) 

- 1<!3= " 1-
-1!57
C

;1!3
/
6!2<2316
U;2316V7
CC&& )   "#  *3
C9 :+,   :+ <58-=9--4/;;>
C,&&H) F "#<"  "  !  
CD :+ ;>
C8 ! !@ B@@I    J    J 
C0
9   K@I "LB4) #&&
9   K@I "LB4 &&
9*&'
9C&&M $  #F"" N+ 

399

Zarządzanie adresami URL

;2316
/ 
M  
6%1
[)
3< 6%1!

å )
6%1<"-/; 7

;1!3
/
6!2<2316
U;2316V7 

"!
U; 6%1V
/
6!2<A1 5 <6

åU;1!3 F 
MY<$V7

Jeśli typ został już wybrany (w takim
przypadku zostanie dołączony do adresu
URL i udostępniony przy użyciu zmiennej
tablicowej +), powiązane z nim adresy
URL powinny być pobrane.

Rozdział 11.
Zmienna ' 
zostanie wykorzystana
na dwa sposoby. Pierwszy z nich będzie
polegał na tym, że zmienna wskaże, że przed
wyświetleniem pierwszego rekordu na stronie
HTML powinna zostać utworzona tabela.
W drugim przypadku zmienna posłuży
do sprawdzenia, czy w wyniku wykonanego
zapytania zostały zwrócone jakiekolwiek
adresy URL.
7. Wyświetlić wszystkie zwrócone rekordy.

Zarządzanie adresami URL

' "1
U;#'
/
6!2<A1 5 <6

åU;1!3 F 
MY<GMMVV
>

"A
U;A"! V
>

15 #
T =1
=#-1/
'"- /I

å51!%5" (/
51%--" (/

å"( /51 1.  

. 

- 
"( /"( 
'"- /9I.A#

å!"H1/c.- #L "?A# . -. 

- 
"( /1A 
'"- /9I.A#

å!"H1/c.%"!A# . -.  

.T7

B
15 #   

. 

- 
"( /a"( a.

å 1A/a %&>;#'\T3T]Ba

å (1 /a< 1'a. 

! "%!! 1!

åU;#'\T " 1T]V  

. -. 

- 
"( /a1A a.>;#'

å\T-1!5"% "# T]B -.  

.a 7

;A"!
/
[GM 7

B

Pętla $# zwróci wszystkie rekordy
pobrane w wyniku wykonanego zapytania.
Przed wyświetleniem pierwszego rekordu
do przeglądarki internetowej zostanie
wysłana tabela i jej nagłówek
(rysunek11.13).

Listing 11.6. Skrypt view_urls.php wyświetla zarówno menu z kategoriami adresów URL,
jak i z adresami dla konkretnej kategorii — ciąg dalszy
9C&& )  "# #
99
9, O O O%&&>+? ACO  OO
9D  :+?  A;& &
98 O O>+?  AC&
90&O'
,+ 29-.'&&D*F#
,C&&M $  
,* 

_1L"
"1
'6L'"1 # #
X- 1(# 
1?#-3
,

"A
U;A"! V
>
,C

15 #
T-"4 
"( /51 1.G? 3 "1
-
'6= 1P
? 1(#""
"1
"! "1P1

X-1
#- #L "?-"4.T7
,9

B
1!1
>
,,

15 #
T =1.T7 

J ? "W5"1 
=1"
,D

B
,8

B 

R# "15
" ! 3?5P"
'3 ?#'1P
;<S \T 6%1T]
,0

6!2<5#!1UV7 

J ? "W5"1
%#NK5H1 "
H
=HK
- 65 
D

" 53-1<# 51
UT" 53-1!! #%? TV7  

#NK5H1 "1
! #%?" 

D

:.

400

Zarządzanie zawartością strony — przykład
8. Wyświetlić komunikat, jeśli nie został

zwrócony żaden adres URL i zakończyć
kod głównej instrukcji warunkowej.

"A
U;A"! V
>

15 #
T-"4 
"( /51 1.G? 3 "1
-

å'6= 1P
? 1(#""
"1
"! "1P1
X-1

å#- #L "?-"4.T7

B
1!1
>

15 #
T =1.T7

B
B

Rysunek 11.13. Lista adresów URL
dla wybranego typu

9. Zakończyć kod źródłowy strony HTML.
6!2<5#!1UV7
" 53-1<# 51
UT" 53-1!! #%? TV7
:.

10. Zapisać plik pod nazwą view_urls.php, umieścić

go na serwerze WWW i przetestować przy
użyciu przeglądarki internetowej.
Wskazówki 
W rozdziale 12. zamieszczono skrypt
Rysunek 11.14. Wygląd strony w przypadku,
gdy z wybranym typem nie powiązano jeszcze
żadnych adresów URL

demonstrujący, w jaki sposób wyświetlać
rekordy na wielu stronach (zapoznaj się
z zawartością ostatniego skryptu tego
rozdziału o nazwie view_users.php). 
Przykłady zawarte w następnym rozdziale

dotyczą również operacji rejestracji
i autoryzacji użytkownika. Jeśli zależy Ci
na ochronie zarządzanych informacji,
obie operacje powinny zostać zastosowane
w aplikacji omawianej w niniejszym rozdziale. 
W razie potrzeby w stosunku do pola
  
można zastosować funkcję 
.! 
(skrót od słów newline to break).

Funkcja zamieni każdy znak nowego wiersza
— tworzony poprzez wciśnięcie klawisza
Return lub Enter — na znacznik języka
(X)HTML postaci /!
01.
401

Zarządzanie adresami URL

Jeśli zostaną zwrócone jakiekolwiek wiersze,
zmienna ' 
znajdująca się wewnątrz
pętli $# przyjmie wartość ,. A zatem,
jeśli wartością zmiennej ' 
nadal będzie 
-, oznacza to, że nie zwrócono żadnych
rekordów i powinien zostać wyświetlony
komunikat podobny do pokazanego na
rysunku 11.14. W przeciwnym razie powinna
zostać wygenerowana kompletna tabela.

Rozdział 11.

Zarządzanie plikami
Ostatnia część omawianej aplikacji internetowej
służy do zarządzania plikami dowolnego typu.
Odpowiednie skrypty pozwolą użytkownikom
przy użyciu przeglądarki internetowej umieścić
na serwerze pliki przechowywane na ich
komputerach (rysunek 11.15). Dodatkowo
do bazy danych zostanie dodany rekord
powiązany z wykonaną operacją.

Zarządzanie plikami

Umieszczanie plików na serwerze
Podobnie jak w przypadku przetwarzania
przy użyciu skryptu PHP dowolnego formularza
zawartego na stronie HTML, również operacja
umieszczania plików na serwerze składa się
z dwóch etapów. Najpierw musi zostać
wyświetlony formularz zawarty na stronie HTML
umożliwiający umieszczanie plików na serwerze.
Po przesłaniu danych wprowadzonych
do formularza skrypt PHP musi skopiować
plik w odpowiednie miejsce na serwerze.
Wymagana składnia kodu źródłowego
definiującego formularz umożliwiający
umieszczenie pliku na serwerze składa się
z trzech części: 
A#
1 5 6%1/ 3 "% A# - 
å5 "# /!5"% % %
1 #-/%#! . 
" %3
6%1/ "--1 
 1/G<[ <MJ 
å431/.
["1 
" %3
6%1/A"1
 1/3%#- 
.

Atrybut   zawarty w pierwszej parze
znaczników kodu formularza oznacza,
że powinien być w stanie obsłużyć wiele typów
danych, włączając w to pliki. Należy również
zauważyć, że formularz musi korzystać z metody
%&. Wartość ukrytego pola 23,4
spełnia w formularzu rolę ograniczenia wielkości
przetwarzanego pliku (wyrażonej w bajtach)
i musi znajdować się przed definicją pola ' ,
które służy do utworzenia na formularzu
odpowiedniego przycisku (rysunek 11.16).

402

Rysunek 11.15. Użytkownicy będą mogli wybrać
plik, który zostanie umieszczony na serwerze

Rysunek 11.16. Definicja typu file tworzy
na formularzu zawartym na stronie HTML
przycisk podobny do pokazanego powyżej

Zarządzanie zawartością strony — przykład
Tabela 11.1. Dane dotyczące pliku umieszczanego
na serwerze mogą zostać uzyskane przy użyciu
powyższych elementów tablicy
Zmienna tablicowa $_FILES
Indeks 
1

Znaczenie
Oryginalna nazwa pliku (przechowywanego
na komputerze użytkownika).

6%1

Typ MIME pliku określony
przez przeglądarkę.

!"H1

Wielkość pliku umieszczanego na serwerze
(wyrażona w bajtach).

%<  1

Tymczasowa nazwa pliku po umieszczeniu
na serwerze.

Począwszy od wersji 4.1 języka PHP, dostęp
do pliku umieszczonego na serwerze może być
uzyskany przy użyciu zmiennej superglobalnej 
,. W przypadku wcześniejszych wersji
(jeśli uaktywniono parametr
" 
"!)
należało skorzystać ze zmiennej tablicowej 
%%&, lub po prostu ze zmiennej 
, powiązanej z nazwą pola ' .
Zmiennej plikowej zostaną przypisane wartości
tablicy wymienione w tabeli 11.1.
Po pobraniu pliku przez skrypt PHP funkcja 
)  '  może go przenieść

z katalogu tymczasowego w jego docelowe
położenie.
#41<3%#-1-<A"1U  
F
å 
V7

Mając to na uwadze, na początku dokonam
modyfikacji pliku konfiguracyjnego języka
PHP o nazwie php.ini tak, aby możliwe było
umieszczanie plików na serwerze, a następnie
zostanie stworzony sam skrypt realizujący
to zadanie.

403

Zarządzanie plikami

Po wywołaniu funkcji zakończonym powodzeniem
tymczasowa wersja pliku zostanie usunięta
z serwera. Aby jednak tak było, serwer WWW
musi dysponować prawem zapisu do katalogu,
w którym zostanie umieszczony plik.

Rozdział 11.
3. Zapisać plik i ponownie uruchomić

Aby przygotować serwer,
należy wykonać następujące kroki:

serwer WWW (rysunek 11.18). 
%5 15 
(51A3

1. W edytorze tekstu otworzyć plik php.ini.
2. W File Uploads zmodyfikować poniższe

parametry (rysunek 11.17):

Zarządzanie plikami

A"1<3%#-!
/ 

3%#-< %<-"
/ 
%
3%#-< +<A"1!"H1
/
*

Pierwszy parametr pozwala na umieszczanie
plików na serwerze lub blokuje taką możliwość.
Drugi parametr pozwala określić miejsce,
w którym tymczasowo będą przechowywane
pliki umieszczane na serwerze. W przypadku
większości systemów operacyjnych przed
parametrem tym można bez większych obaw
umieścić znak komentarza (znak średnika).
Użytkownicy systemów Mac OS X i UNIX
zazwyczaj dla parametru ustawiają katalog
/tmp, natomiast w przypadku systemu
Windows powinni korzystać z katalogu
określonego ścieżką C:\PHP\uploadtemp.
Ostatni z wymienionych parametrów służy
do określenia maksymalnej wielkości plików
(wyrażonej w megabajtach) umieszczanych
na serwerze.

Powyższe polecenie służy do ponownego
uruchomienia serwera Apache działającego
pod systemem operacyjnym UNIX.
Użytkownicy systemu Mac OS X
w celu ponownego uruchomienia serwera
mogą użyć panelu Sharing, natomiast
w przypadku systemu Windows należy
posłużyć się apletem Usługi znajdującym
się w Panelu sterowania lub innym
narzędziem współpracującym
z serwerem WWW.
4. Utworzyć nowy katalog o nazwie uploads

znajdujący się poza strukturą katalogową
serwera WWW. Katalog ten będzie spełniał
rolę docelowego miejsca, w którym będą
umieszczane pliki na serwerze. Ze względu
na zabezpieczenia katalog nie powinien
być częścią struktury katalogowej
serwera WWW.

Rysunek 11.17. Sekcja File Uploads pliku
php.ini odpowiedzialna za obsługę plików
umieszczanych na serwerze

Rysunek 11.18. Aby zmiany dokonane w pliku konfiguracyjnym języka PHP
zostały uwzględnione, konieczne jest ponowne uruchomienie serwera WWW

404

Zarządzanie zawartością strony — przykład
5. Ustawić dla katalogu uploads takie uprawnienia,

aby serwer WWW mógł w nim umieszczać pliki.
Pewna, ale mniej bezpieczna metoda polega na
wykonaniu polecenia # 567775 
(systemy UNIX i Mac OS X). W przypadku
systemu Windows należy kliknąć katalog
prawym przyciskiem myszy, a następnie wybrać
pozycję Udostępnianie. Spowoduje to
wyświetlenie okna zawierającego kartę
Udostępnianie (rysunek 11.19).

Rysunek 11.19. Karta Udostępnianie
w systemie Windows pozwala na określenie,
kto będzie dysponował dostępem do katalogu

Wskazówki 
Wartość pola 23,4 ogranicza

w przeglądarce wielkość pliku. Plik konfiguracyjny
języka PHP dysponuje własnymi ograniczeniami.
Można również przeprowadzić walidację wielkości
pliku umieszczonego na serwerze przy użyciu
skryptu PHP. 
Parametr  *8 zawarty w pliku php.ini
Rysunek 11.20. Jeśli uprawnienia nie
zostaną poprawnie zdefiniowane, pojawią się
komunikaty błędów podobne do pokazanego

służy do określenia maksymalnej ilości danych
(wyrażonej w megabajtach), które mogą zostać
umieszczone na serwerze przy użyciu jednego
skryptu. Domyślnie jest to 8 MB. 
W języku PHP w wersji 4.2 nowością jest indeks
błędów zmiennej tablicowej ,. Jego

zadaniem jest przechowywanie dowolnych
informacji dotyczących błędów powiązanych
z plikiem umieszczanym na serwerze. 
Ze względu na czas wymagany

do umieszczenia dużego pliku
na serwerze może być konieczna
modyfikacja wartości parametru 
* *    zawartego
w pliku php.ini lub tymczasowe
przekazanie jej do skryptu przy
użyciu funkcji     . 

Jeśli mamy na uwadze kwestię zabezpieczeń,

przechowywanie plików umieszczanych
na serwerze poza strukturą katalogów serwera
WWW jest bardziej wskazane. Dzięki temu
uniemożliwi się użytkownikom uzyskanie
bezpośredniego dostępu do plików i uniknie się
zagrożenia związanego z umieszczaniem katalogu
dysponującego mało restrykcyjnymi uprawnieniami
w miejscu publicznie dostępnym.
405

Zarządzanie plikami

W zależności od stosowanego systemu
operacyjnego może się okazać, że będzie
możliwe umieszczanie plików na serwerze bez
konieczności wykonywania tego kroku. Aby się
o tym przekonać, przed modyfikacją uprawnień
należy wykonać poniższy skrypt. Jeśli zostaną
wyświetlone komunikaty podobne do pokazanego
na rysunku 11.20, należy dokonać zmiany
w uprawnieniach.

Rozdział 11.

Aby utworzyć skrypt add_file.php,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP

(listing 11.7). 
:% %
@ 
"! " ( 
D  

--<A"1% %
;%(1< " 1
/
T "1!H5H "1
%"?3
å 
!1'1H1T7
" 53-1
UT" 53-1! (#'1? TV7

2. Sprawdzić, czy wypełniono formularz

Zarządzanie plikami

i przeprowadzić walidację wartości pola
  
.
"A
U"!!1 U;<M\T!3= " T]VV
> 

123"1<# 51
UT 6!2<5# 15 % %TV7

A3 5 "#
1!5%1<- 
U;- V
>

(#=
;-=57

"A
U" "<(1 UT ("5<23# 1!<(%5TVV
>

;- 
/
! "%!! 1!U;- V7

B 

1 3
6!2<1<1!5%1<! " (

åU "
U;- VF
;-=5V7

B

"A
U1 % 6U;<M\T-1!5"% "# T]VV
>

;-
/
1!5%1<- 

åU;<M\T-1!5"% "# T]V7

B
1!1
>

;-
/
TT7

B

Podobnie jak w przypadku omawianego
wcześniej skryptu add_url.php, dla pola
  
zostanie przeprowadzana
najprostsza walidacja. Ze względu na to,
że pozostałe pola formularza nie wymagają
sprawdzenia, zastosowano tylko jedną
instrukcję warunkową.
W celu określenia, czy rozmiar pliku
umieszczanego na serwerze zawiera się
w założonym przedziale można również
sprawdzić jego wielkość.

Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze  

:% %
@ 
"! " ( 
D  

--<A"1% %
* 

M # 
%#H'
3X6 ?#' "?#
3 "1L5"^
%"?"

!1'1H1   

! '"1 "1
6 3N3
! # 6
"
-#NK5H1 "1
(NO'? 

C

;%(1< " 1
/
T "1!H5H "1
%"?3

!1'1H1T7
9

" 53-1
UT" 53-1! (#'1? TV7
,

"A
U"!!1 U;<M\T!3= " T]VV
>  

=!N3(
A# 3H
D 

123"1<# 51
UT 6!2<5# 15 % %TV7  

#NK5H1 "1
H
=HK
- 65 
8 

[3 ?5P
3!3'PK5
H ?
TT
"
#=5" PK5
- 1
'%#'-H# 1
'
A# 3H3
0

A3 5 "#
1!5%1<- 
U;- V
> 

(#=
;-=57 

"A
U" "<(1 UT ("5<23# 1!<(%5TVV
> 
*

;- 
/
! "%!! 1!U;- V7 

B 
C 

1 3
6!2<1<1!5%1<! " (
U "
U;- VF
;-=5V7 
9

B 

R# "15
!1?5P"
A3 ?5P"
1!5%1<- UV

406

Zarządzanie zawartością strony — przykład
3. Wstawić do bazy danych rekord powiązany

z plikiem umieszczanym na serwerze.
;2316
/ 
$M ) 
$
3%#-!
UA"1<  1F
åA"1<!"H1F
A"1< 6%1F
-1!5"% "# F
å3%#-<- 1V
EG M
åUT>;<[ M\T3%#-T]\T  1T]BTF
å>;<[ M\T3%#-T]\T!"H1T]BF
åT>;<[ M\T3%#-T]\T 6%1T]BTF
åT;-TF
$UVV7
;1!3
/
Z 6!2<2316
U;2316V7

"A
U;1!3 V
>

;1+ 1 !"#
/
1+%#-1
UTTF

å;<[ M\T3%#-T]\T  1T]V7

;3"-
/
6!2<" !1 <"-UV7

;A"1  1
/
;3"- 

TT 

;1+ 1 !"# \]7

Plik zostanie zapisany na serwerze pod nową
nazwą. Takie rozwiązanie jest o wiele bardziej
bezpieczne niż w przypadku posługiwania się
oryginalną nazwą nadaną przez użytkownika.
Nazwa pliku będzie złożona z wartości
bazodanowego pola   (pobranej
przy użyciu funkcji   
),
za którą zostanie wstawiona kropka
i rozszerzenie oryginalnego pliku (uzyskanego
poprzez rozkład jego nazwy). Przykładowo,
dokument o nazwie chapter.doc może przyjąć
nazwę 231.doc, natomiast plik imagename.jpg
zostanie zapisany jako 49.jpg.

Zarządzanie plikami

Informacja o każdym pliku umieszczonym
na serwerze zostanie zapisana w bazie
danych. W tym celu zostanie zastosowana
wielowymiarowa zmienna tablicowa 
,, która będzie przechowywała
oryginalną nazwę pliku, jego wielkość
i typ MIME. Wszystkie te dane zostaną
pobrane z przeglądarki internetowej.
Dodatkowo zostanie zapisany opis
oraz aktualna data i godzina.

4. Utworzyć nowy plik.

Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze — ciąg dalszy 
, 

M%'-H1 "1
#=15 #L5"
#%"!3
U "1
P1!
'6 ( 1V 
D

"A
U1 % 6U;<M\T-1!5"% "# T]VV
> 
8

;-
/
1!5%1<- U;<M\T-1!5"% "# T]V7 
0

B
1!1
>
*

;-
/
TT7
*

B
**
*&&6  #! " 
*C+,P-.30P04  :  <  "< < 
 <   ;Q9.-:>+2P.-?  A? AC< 
>+2P.-?  A? "AC<>+2P.-?  A?AC<+<4 :;;'
*9+ R, ,:+,;'
*,
*D :+ ;>
*8
*0&&"  " # 
+S S :<+2P.-?  A? A;' 
+ ,   :;'&&P #  # ""   
" 
*+  + +S ?BA'  

C&&(""  # 
9 :   
:+2P.-?  A? A< 
&  &+  ;;> 
,

15 #
T%."?
H#! N
3 "1!H5H# 6

!1'1H1%.T7

407

Rozdział 11.
5. Skopiować plik w docelowe miejsce

na serwerze.

Zarządzanie plikami

"A
U #41<3%#-1-<A"1U;<[ M

å\T3%#-T]\T %<  1T]F 
3%#-!

å;A"1  1VV
>

15 #
T%."?
H#! N
3 "1!H5H# 6

å 
!1'1H1%.T7

B
1!1
>

15 #
T%.A#
5##/1-.

åH1 "1!"1 "1
%"?3
"1
=6N#

å #X"'1A# .%.T7

;2316
/ 
 
[)
3%#-! 
)

å3%#-<"-
/
;3"-7

;1!3
/
Z 6!2<2316
U;2316V7

B

W celu przeniesienia pliku tymczasowego
w docelowe miejsce (katalog uploads,
gdzie plik uzyska nową nazwę) należy
użyć funkcji )  ' .
Jeśli przeniesienie pliku nie będzie
możliwe (rysunek 11.20), z bazy danych
zostanie usunięty rekord i pojawi się
komunikat błędu.
6. Dokończyć tworzenie instrukcji

warunkowej i skryptu PHP.

B
1!1
>

15 #
T%.A#
5##/1-.$
!?3 1?

å=NW-3
!6! 1 #'1(#
'6!N 1
H%6  "1

å "1
#(N#
H#! ^
%H1 '#H# 1

åH1%!H 6
H
H"! "NK

å "1-#(#- #L^A# .%.T7

B

6!2<5#!1UV7
B
:.

Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze — ciąg dalszy 
D

B
1!1
> 
8

15 #
T%.A#
5##/1-.H1 "1!"1 "1
%"?3
"1
=6N#
#X"'1A# .%.T7 
0
C  

!3 "W5"1 
1?#-3
H
=H6
- 65 
C

;2316
/ 
 
[)
3%#-! 
)
3%#-<"-
/
;3"-7
C*

;1!3
/
Z 6!2<2316
U;2316V7
C

B
CC
C9

B
1!1
> 

_1L"
H%6  "1

=H"1
- 65
"1
H#!  "1
'6?#  1
%'"-N#'#
C,

15 #
T%.A#
5##/1-.$
!?3 1?
=NW-3
!6! 1 #'1(#
'6!N 1
H%6  "1

"1
#(N#
H#! ^
%H1 '#H# 1 
H1%!H 6
H
H"! "NK
"1-#(#- #L^A# .%.T7
CD

B
C8
C0

6!2<5#!1UV7 

J ? "W5"1
%#NK5H1 "
H
=HK
- 65 
9
9

B 

R# "15
" ! 3?5P"
'3 ?#'1P
#=!N3(3PK51P
- 1
'%#'-H 1
'
A# 3H3
9*

:.
9
9C   &T    U+-.3Q.3?(V(-.2A'U 

99
9,   59W2P.-PD. 
KXYXZZ

408

Zarządzanie zawartością strony — przykład
7. Zdefiniować formularz zawarty

na stronie HTML. 
A#
1 5 6%1/ 3 "% A# - 
å5 "# /:% %
15 #
;<M )E )\T<M [T]7
å:.
1 #-/%#! . 
" %3
6%1/ "--1 
 1/G<[ <MJ 
å431/9*C*88. 
A"1-!1 .1(1 -.
513
3 "1!H5H1 "
å%"?3

!1'1H1
1X6
'6%1N "^
åA# 3H&1(1 -.

Co prawda formularz jest bardzo prosty,
ale zawiera trzy niezbędne elementy
związane z umieszczaniem plików
na serwerze — atrybut   ,
ukryte pole 23,4 i pole ' .
8. Zakończyć tworzenie skryptu PHP. 
:% %
" 53-1
UT" 53-1!! #%? TV7
:. 

%.=."?&=. 
" %3
6%1/A"1
å  1/3%#- 
.%. 
%.=.%"!&=. 
1+ 1
å  1/-1!5"% "# 
5#!/C
å#'!/9. 1+ 1.%. 
A"1-!1 . 

A# .

Listing 11.7. Skrypt pozwala użytkownikowi umieścić plik na serwerze — ciąg dalszy
9D 

A"1-!1 .1(1 -.
513
3 "1!H5H1 "
%"?3

!1'1H1
1X6
'6%1N "^
A# 3H&1(1 -.
98
90!( #%&!     &&
,
, 

%.=.%"!&=. 
1+ 1
 1/-1!5"% "# 
5#!/C 
#'!/9. 1+ 1.%.
,*
, 

A"1-!1 .
,C
,9 

-"4 
"( /51 1." %3
6%1/!3= " 
 1/!3= " 
431/6L"P 
.-"4.
,,
,D 

A# .
R# "15
A# 3H.
,8
,0 

:% %
D

" 53-1
UT" 53-1!! #%? TV7  

#NK5H1 "1
! #%?" 

D

:.

409

Zarządzanie plikami 

-"4 
"( /51 1." %3
6%1/!3= " 
å  1/!3= " 
431/6L"P 
.-"4.

Rozdział 11.
9. Zapisać plik pod nazwą add_file.php,

umieścić go na serwerze WWW
i przetestować przy użyciu przeglądarki
internetowej (rysunki 11.21 i 11.22).
Wskazówki 
Obecność pliku umieszczonego na serwerze

może również zostać sprawdzona przy użyciu
funkcji  ' . 
W celu odwołania się do katalogów

użytkownicy systemu Windows muszą
skorzystać ze znaku 0 lub 99, a zatem
zamiast ścieżki C:\ należy użyć C:/
lub C:\\. Wynika to stąd, że w języku
PHP znak 95jest wykorzystywany
przez funkcję     .

Rysunek 11.21. Formularz służący
do umieszczania plików na serwerze

Zarządzanie plikami 

Jeśli jest wykorzystywana starsza wersja

języka PHP, może nie być możliwe
zastosowanie zmiennej tablicowej 
,. Na skutek tego zamiast funkcji 
)  '  konieczne będzie
użycie funkcji  . 
Jeśli oba pliki mają taką samą nazwę,
funkcja )  '  nadpisze

istniejący plik bez wcześniejszego ostrzeżenia. 
Po przygotowaniu ostatecznej wersji

produkcyjnej skryptu w celu wyeliminowania
w przyszłości wszelkich komunikatów
błędów należy przed wywołaniami funkcji 
)  '  wstawić znak :.

410

Rysunek 11.22. Wygląd strony po udanym
umieszczeniu pliku na serwerze

Zarządzanie zawartością strony — przykład

Przeglądanie i pobieranie plików
Moduł administracyjny
aplikacji

Jedną z zalet systemu służącego
do umieszczania plików na serwerze
jest łatwość kojarzenia plików z danymi
na ich temat przechowywanymi w bazie
danych (gdy do tworzenia nazw plików
jest wykorzystywana wartość pola  
). Jeśli zostanie utworzony
skrypt administracyjny służący do
usuwania plików z serwera (z katalogu
uploads), można również usunąć z tabeli
powiązany z nim rekord.

W celu stworzenia skryptu view_files.php
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP

(listing 11.8). 
:% %
@ 
"! " ( 
8 

4"1'<A"1!% %
;%(1< " 1
/
TH1(K- "1
%"?O'T7
" 53-1<# 51
UT" 53-1! (#'1? TV7 
123"1<# 51
UT 6!2<5# 15 % %TV7
;A"!
/ 
) 7

Zmienna ' 
spełnia taką samą rolę jak
w skrypcie view_urls.php. Zmienna zostanie
wykorzystana przy tworzeniu nagłówka
i w celu określenia, czy będzie możliwe
przeglądanie niektórych plików.
2. Pobrać z bazy danych informacje

o wszystkich plikach.
;2316
/ 
M  
3%#-<"-F
A"1<  1F
å)$UA"1<!"H1*CV
GM
A!F
-1!5"% "# F
åG <[)GU3%#-<- 1F
TI
I1F
ITV
GM
å[)
3%#-! 
) ) 

3%#-<- 1 
M7
;1!3
/
6!2<2316
U;2316V7

Powyższe zapytanie zwróci dla każdego
pliku umieszczonego na serwerze wartości
przechowywane w polach   ,
'  ,   
, a ponadto
sformatowaną datę. Na początku zostaną
wyświetlone informacje dotyczące
najnowszych plików. Jednocześnie
zapytanie pozwoli na uzyskanie
wielkości plików (wyrażonej w kilobajtach),
co będzie możliwe poprzez podzielenie
przechowywanej wartości przez 1024,
a następnie zaokrąglenie otrzymanej liczby.

411

Zarządzanie plikami

Chociaż w przypadku omawianej
aplikacji nie stworzono jej części
administracyjnej, to jednak nie jest
to zadanie trudne do zrealizowania.
Na początku należy do tabeli  
dodać pole  
) . Następnie
należy tak zmodyfikować zarówno
plik add_url.php, jak i add_file.php,
aby domyślnie wartość pola  

) wynosiła N. Z myślą o części
administracyjnej aplikacji należy
stworzyć stronę, na której zostaną
wyświetlone wszystkie elementy, które
jeszcze nie zatwierdzono. W celu
zaakceptowania dowolnego elementu
należy dla odpowiedniego rekordu
tabeli wykonać polecenie -%
i zmienić wartość pola  
) na Y.

Ostatnie dwa skrypty omawianej aplikacji pozwolą
użytkownikom przeglądnąć pliki umieszczone
na serwerze, a następnie je pobrać (w danej
chwili tylko jeden). Skrypt służący do przeglądania
plików jest dość prosty, natomiast skrypt
umożliwiający ich pobieranie wymaga częstego
stosowania funkcji języka PHP o nazwie #  
.

Rozdział 11.

Zarządzanie plikami

Listing 11.8. Skrypt view_files.php wyświetla pliki umieszczone na serwerze wraz z ich opisem,
wielkością i datą wykonania operacji  

:% %
@ 
"! " ( 
8 

4"1'<A"1!% %
* 

M # 
%#H'
3X6 ?#' "?#
%H1(K-^
%"?"
3 "1!H5H# 1

!1'1H1   

! '"1 "1
6 3N3
! # 6
"
-#NK5H1 "1
(NO'? 

C

;%(1< " 1
/
TH1(K- "1
%"?O'T7
9

" 53-1<# 51
UT" 53-1! (#'1? TV7
,
D 

123"1<# 51
UT 6!2<5# 15 % %TV7  

#NK5H1 "1
H
=HK
- 65 
8
0

;A"!
/ 
) 7  

"5P"H5P
H "1 1P   

6!N "1
H%6  "
-#
=H6
- 65  
+,-../0   <  <346:  "&B@XY;9-< 
 <690.243590:   <I5I<I8;9-2345  436.378   6.-/' 
*+ , ,:+,;' 
&& )   "#  *3 
C :+,   :+ <58-=9--4/;;> 
9&&H) F "#<"  "  !   
, :+ ;> 
D ! !@ B@@I    J    J  
8 
0   X@I "LB "  #&&
*   Y@I "LB4 &&
*  X@I "LB3"  #&&
**   X@I "LB6   ""  # 
"&&
*&'
*CC&&M $  #F"" N+ 
*9&& )  "# #
*,
*D O O O   U >+?   AC 
O>+?  AC& &
*8 O O  :+?  A;&
*0 OO>+?AC#!& 
O O>+?AC& 
&O' 
*+ 29-.'&&D*F# 
C&&M $   
C 

_1L"
"1
'6L'"1 # #
X- 1(# 
1?#-3 
9

"A
U;A"! V
> 
,

15 #
T-"4 
"( /51 1.G? 3 "1
"1 

X- 1(#
%"?3-"4.T7 
D

B
1!1
> 
8

15 #
T =1.T7 

J ? "W5"1 
=1" 
0

B
C

6!2<5#!1UV7 

J ? "W5"1
%#NK5H1 "
H
=HK
- 65 
C

" 53-1<# 51
UT" 53-1!! #%? TV7  

#NK5H1 "1
! #%?" 

C*

:.

412

Zarządzanie zawartością strony — przykład
3. Wyświetlić wszystkie rekordy.

4. Jeśli nie znaleziono żadnych plików

lub zamknięto tabelę, należy wyświetlić
komunikat.
"A
U;A"! V
>

15 #
T-"4 
"( /51 1.G? 3 "1

å "1 

X- 1(#
%"?3-"4.T7
B
1!1
>

15 #
T =1.T7
B

5. Zakończyć tworzenie skryptu PHP.
6!2<5#!1UV7
" 53-1<# 51
UT" 53-1!! #%? TV7

:.

6. Zapisać plik pod nazwą view_files.php,

umieścić go na serwerze WWW i przetestować
przy użyciu przeglądarki internetowej.

Również w tym przypadku powyższy
kod działa podobnie jak w poprzednim
skrypcie view_urls.php. Zmienna ' 

jest używana raz przy tworzeniu nagłówka
(rysunek 11.23), po czym są wyświetlane
wszystkie rekordy. Przy odwoływaniu
się do funkcji ' #  

jest stosowana stała 2;<&,
np. w celu wyświetlenia wartości
należy użyć instrukcji  
$=>'>?.
Rysunek 11.23. Strona wyświetlona po uruchomieniu
skryptu view_files.php

413

Zarządzanie plikami

' "1
U;#'
/
6!2<A1 5 <6
U;1!3 F
åMY<GMMVV
>

"A
U;A"! V
>

15 #
T =1
=#-1/
'"- /I

å51!%5" (/
51%--" (/

å"( /51 1.  

. 

- 
"( /1A 
'"- /*I.A#

å!"H1/c.$H'
%"?3A# . -. 

- 
"( /1A 
'"- /CI.A#

å!"H1/c.%"!A# . -. 

- 
"( /51 1
'"- /*I.A#

å!"H1/c.)#H "
%"?3A# . -. 

- 
"( /1A 
'"- /*I.A#

å!"H1/c. 
3 "1!H5H1 "
%"?3

å 
!1'1H1A# . -.  

.T7

B

15 #   

. 

- 
"( /a1A a. 
1A/

åa-#' #-<A"1% %:3"-/

å>;#'\T3%#-<"-T]Ba.>;#'

å\TA"1<  1T]B. -. 

- 
"( /a1A a. 

å! "%!! 1!U;#'\T-1!5"% "# T]V 

å -. 

- 
"( /a51 1a.

å>;#'\TA!T]B?= -. 

- 
"( /a1A a.>;#'\T-T]B -.  

.a 7

;A"!
/
[GM 7
B

Każda nazwa pliku spełnia rolę odnośnika
do skryptu download_file.php, przy czym
do adresu URL jest dołączana wartość pola  
. Wartość ta zostanie wykorzystana
przez skrypt służący do pobierania plików
w celu określenia, który z nich ma być
przesłany do przeglądarki internetowej.

Rozdział 11.

Aby utworzyć skrypt download_file.php,
należy wykonać następujące kroki:
1. W edytorze tekstu utworzyć nowy skrypt PHP

(listing 11.9). 
:% %
@ 
"! " ( 
0 

-#' #-<A"1% %

2. Sprawdzić wartość pola   .
"A
U"!< 3 1"5
U;<S \T3"-T]VV
>

Przed kontynuacją należy upewnić się,
czy skrypt pobrał poprawną wartość pola  
, która powinna być liczbą.
3. Pobrać informacje na temat pliku.

Zarządzanie plikami 

123"1<# 51
UT 6!2<5# 15 % %TV7
;2316
/ 
M  
A"1<  1F
A"1< 6%1F
åA"1<!"H1
[)
3%#-! 
)
3%#-<"å/
>;<S \T3"-T]B7
;1!3
/
6!2<2316
U;2316V7 
"!
U;A F
;A F
;A!V
/
6!2<A1 5 <6
åU;1!3 F 
MY<$V7
6!2<5#!1UV7

W celu pobrania pliku konieczna jest
znajomość jego nazwy, typu, wielkości.
Wszystkie te dane zostaną pobrane z bazy
danych poprzez wykonanie zapytania,
w którym umieszczono instrukcje 
+=> >?, a następnie wywołanie
funkcji  .
4. Określić nazwę pliku.
;1+ 1 !"#
/
1+%#-1
UTTF
;A V7
; 1<A"1
/
T3%#-!T 

;<S \T3"-T]
å
TT 

;1+ 1 !"# \]7

Działanie powyższego kodu jest
podobne do funkcjonowania mechanizmu
nazewniczego zastosowanego w skrypcie
add_file.php, z tą różnicą, że w tym
przypadku dodano ścieżkę postaci
../uploads/. Przypisanie takiego łańcucha
zmiennej ułatwi odwoływanie się do pliku
w dalszej części skryptu.

Listing 11.9. Poprzez przesłanie do przeglądarki internetowej odpowiednich nagłówków skrypt
wymusza wykonanie operacji pobrania pliku  

:% %
@ 
"! " ( 
0 

-#' #-<A"1% %
* 

M # 
%#H'

%#= "1
%"?3
H
!1'1
%H6
3X65"3
A3 ?5P"
1-1UV 

C

"A
U"!< 3 1"5
U;<S \T3"-T]VV
>  

-1 6A"? #
%"?3
3 "1!H5H# 1(#

!1'1H1
9
, 

123"1<# 51
UT 6!2<5# 15 % %TV7  

#NK5H1 "1
H
=HK
- 65 
D
8  

#= "1
" A# 5P"

1 
%"?3
0

;2316
/ 
M  
A"1<  1F
A"1< 6%1F
A"1<!"H1
[)
3%#-! 
)
3%#-<"-
/
>;<S \T3"-T]B7 

;1!3
/
6!2<2316
U;2316V7  

"!
U;A F
;A F
;A!V
/
6!2<A1 5 <6
U;1!3 F 
MY<$V7 
*

6!2<5#!1UV7 

J ? "W5"1
%#NK5H1 "
H
=HK
- 65    

?1L1 "1
H'6
%"?3
3 "1!H5H# 1(#

!1'1H1 
C

;1+ 1 !"#
/
1+%#-1
UTTF
;A V7 
9

; 1<A"1
/
T3%#-!T 

;<S \T3"-T] 

TT 

;1+ 1 !"# \]7 
, 
D 

M%'-H1 "1F
5H6
%"?
"! "1P1 
8

"A
UA"1<1+"! !
U; 1<A"1VV
>

414

Zarządzanie zawartością strony — przykład
5. Sprawdzić, czy plik istnieje na serwerze.
"A
UA"1<1+"! !
U; 1<A"1VV
>

Przed wysłaniem pliku do przeglądarki
internetowej należy upewnić się, czy istnieje.
Jeśli plik istnieje na serwerze, funkcja
'  *   zwróci wartość TRUE.
6. Wysłać plik.
1-1
U# 1 6%1& 
%%"5 "# ;A V7
1-1
U# 1 -"!%#!" "# &  
5 1 7
åA"1  1/;A V7
1-1
U# 1 1 ( &
;A!V7 
1-A"1
U; 1<A"1V7
; 1!!(1
/
T%."?
H#! N
'6!N 6%.T7

Wywołania funkcji #  
powodują
przesłanie do przeglądarki pliku i utworzenie
okna dialogowego (rysunek 11.24). W oparciu
o typ MIME (zapisany w bazie danych po
umieszczeniu pliku na serwerze) pierwszy wiersz
ma za zadanie przygotowanie przeglądarki
do odebrania pliku. Drugi wiersz przy użyciu
oryginalnej nazwy pliku przechowywanego
na komputerze użytkownika określa nazwę
pobieranego pliku. Ostatnia funkcja #  

informuje o ilości przesyłanych danych.
Również ta informacja została ustalona
po umieszczeniu pliku na serwerze. Zawartość
pliku jest przesyłana przy użyciu funkcji

 ' , która po jego odczytaniu natychmiast
przekazuje zawartość strony do przeglądarki
internetowej.

Zarządzanie plikami

Listing 11.9. Poprzez przesłanie do przeglądarki internetowej odpowiednich nagłówków skrypt
wymusza wykonanie operacji pobrania pliku — ciąg dalszy 
0  

6!N "1
%"?3
*

1-1
U# 1 6%1& 
%%"5 "# ;A V7
*

1-1
U# 1 -"!%#!" "# &  
5 1 7
A"1  1/;A V7
**

1-1
U# 1 1 ( &
;A!V7
* 

1-A"1
U; 1<A"1V7
*C
*9

; 1!!(1
/
T%."?
H#! N
'6!N 6%.T7
*,
*D

B
1!1
>  

"?
"1
"! "1P1
*8

; 1!!(1
/
T%.A#
5##/1-.- 1H"1 "1
%"?3

!1'1H1
"1
=6N#

#X"'1 
H1%!H 6
H
H"! "NK
"1-#(#- #L^A# .%.T7
*0

B  

B
1!1
> 

$"1%'"-N#'6
"-1 6A"? #
%"?3
3 "1!H5H# 1(#

!1'1H1 
* 

; 1!!(1
/
T%.A#
5##/1-.#!HW
'6=^
%#%' 6
%"?
H P-3PK56
!"W


!1'1H1A# .%.T7 
C 
9

B 
, 
D  

! '"1 "1
6 3N3
! # 6
"
-#NK5H1 "1
(NO'?  

8

;%(1< " 1
/
T#="1 "1
%"?3T7 
0

" 53-1<# 51
UT" 53-1! (#'1? TV7
C
C

15 #
; 1!!(17
C*
C

" 53-1<# 51
UT" 53-1!! #%? TV7
CC

:.

415

Rozdział 11.
7. Zakończyć instrukcje warunkowe.

B
1!1
>

; 1!!(1
/
T%.A#
5##/

å1-.- 1H"1 "1
%"?3

!1'1H1

å "1
=6N#
#X"'1 
H1%!H 6
H

åH"! "NK
"1-#(#- #L^A# .%.T7

B
B
1!1
>

; 1!!(1
/
T%.A#
5##/1-.#!HW

å'6=^
%#%' 6
%"?
H P-3PK56
!"W

å 
!1'1H1A# .%.T7
B

8. Wprowadzić zawartość strony internetowej.

Zarządzanie plikami

;%(1< " 1
/
T#="1 "1
%"?3T7
" 53-1<# 51
UT" 53-1! (#'1? TV7
15 #
; 1!!(17
" 53-1<# 51
UT" 53-1!! #%? TV7
:.

Tak naprawdę większość przeglądarek
internetowych nigdy nie wyświetli tych
informacji. Większość użytkowników
po kliknięciu odnośnika wywołującego
skrypt view_files.php zobaczy jedynie okno
dialogowe umożliwiające pobranie pliku.
Wykorzystanie powyższego kodu źródłowego
nie spowoduje obniżenia stopnia zabezpieczeń.
Dodatkowo kod zostanie zastosowany
w przypadku wystąpienia jakiegokolwiek
problemu.
9. Zapisać plik pod nazwą download_file.php,

umieścić go na serwerze WWW i przetestować
przy użyciu przeglądarki internetowej.
Wskazówki 
W języku PHP w wersji 4.3 nowością jest
funkcja       zwracająca typ

MIME dla pliku znajdującego się na serwerze. 
Przeglądarki internetowe w różny sposób

obsługują operację pobierania plików.
Z tego też powodu w celu sprawdzenia
zgodności uzyskiwanych wyników skrypt
podobny do powyższego powinien zostać
przetestowany w miarę możliwości na jak
największej liczbie przeglądarek i platform.

416

Rysunek 11.24. Kliknięcie odnośnika wywołującego
skrypt view_files.php powinno spowodować
wyświetlenie pokazanego okna dialogowego