Professional Documents
Culture Documents
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. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
Przedmowa ..................................................................................... 11
Rozdzia 1. Instalacja ....................................................................................... 17
Instalacja w systemie Windows ...................................................................................... 18
Instalowanie systemu MySQL ................................................................................. 18
Instalowanie jzyka PHP .......................................................................................... 22
Instalacja w systemie Linux ........................................................................................... 27
Usuwanie wersji w formie pakietowej ..................................................................... 28
Instalowanie systemu MySQL ................................................................................. 29
Instalowanie jzyka PHP .......................................................................................... 31
Instalowanie w systemie Mac OS X ............................................................................... 34
Instalowanie systemu MySQL ................................................................................. 35
Instalowanie jzyka PHP .......................................................................................... 36
System Mac OS X a Linux ....................................................................................... 36
Zadania poinstalacyjne ................................................................................................... 37
Jeli nasz serwer WWW ju obsuguje jzyk PHP i bazy MySQL ................................ 39
Nasz pierwszy skrypt PHP ............................................................................................. 40
Podsumowanie ............................................................................................................... 42
Spis treci
7
Sprawdzanie i naprawianie plikw danych MySQL .................................................... 174
Podsumowanie ............................................................................................................. 177
Spis treci
9
mysql_field_flags ......................................................................................................... 312
mysql_field_len ............................................................................................................ 313
mysql_field_name ........................................................................................................ 313
mysql_field_seek .......................................................................................................... 313
mysql_field_table ......................................................................................................... 313
mysql_field_type .......................................................................................................... 313
mysql_free_result ......................................................................................................... 314
mysql_get_client_info .................................................................................................. 314
mysql_get_host_info .................................................................................................... 314
mysql_get_proto_info .................................................................................................. 314
mysql_get_server_info ................................................................................................. 314
mysql_info .................................................................................................................... 315
mysql_insert_id ............................................................................................................ 315
mysql_list_dbs .............................................................................................................. 315
mysql_list_fields .......................................................................................................... 315
mysql_list_processes .................................................................................................... 315
mysql_list_tables .......................................................................................................... 316
mysql_num_fields ........................................................................................................ 316
mysql_num_rows ......................................................................................................... 316
mysql_pconnect ............................................................................................................ 316
mysql_ping ................................................................................................................... 316
mysql_query ................................................................................................................. 317
mysql_real_escape_string ............................................................................................. 317
mysql_result ................................................................................................................. 317
mysql_select_db ........................................................................................................... 317
mysql_stat .................................................................................................................... 318
mysql_tablename .......................................................................................................... 318
mysql_thread_id ........................................................................................................... 318
mysql_unbuffered_query .............................................................................................. 318
Rozdzia 4.
Publikowanie
w sieci WWW danych
przechowywanych
w bazie MySQL
Nareszcie, wanie na to czekalimy! W tym rozdziale dowiemy si, jak pobiera informacje przechowywane w bazie danych i wywietla je na stronie WWW, aby mieli do
nich dostp wszyscy uytkownicy. Do tej pory zainstalowalimy i nauczylimy si podstaw dziaania MySQL, systemu zarzdzania relacyjnymi bazami danych oraz PHP, jzyka skryptowego dziaajcego po stronie serwera. Teraz dowiemy si, jak poczy oba
te narzdzia, by za ich pomoc przygotowa witryn WWW opart na bazie danych!
78
Tak jak zostao to przedstawione na rysunku 4.1, jzyk skryptowy PHP peni funkcj
porednika, ktry potrafi posugiwa si oboma jzykami. Najpierw przetwarza danie strony i pobiera dane z bazy MySQL, a nastpnie porzdkuje je dynamicznie, przygotowujc adnie sformatowan stron HTML, ktrej oczekuje przegldarka. Jzyk
PHP pozwala przygotowa wszelkie aspekty zwizane z prezentacj naszej witryny
(zaprojektowa opraw graficzn i ukad strony) w formie szablonw napisanych
w zwykym kodzie HTML. Kiedy przystpujemy do wypenienia tych szablonw treci, znowu wykorzystujemy kod PHP, by poczy si z baz danych MySQL i
uywajc zapyta SQL takich jak te, ktre testowalimy na tabeli kawaly w rozdziale
2., Wprowadzenie do systemu MySQL pobra odpowiedni zawarto i wywietli j we waciwych miejscach szablonw.
Rysunek 4.1.
Schemat pokazujcy,
w jaki sposb jzyk
PHP pobiera dane
z bazy MySQL,
by przygotowa
strony WWW
79
W tym wzorcu polecenie adres to adres IP lub nazwa hosta komputera, na ktrym dziaa serwer MySQL ('localhost' jeli funkcjonuje na tym samym komputerze co serwer WWW), a nazwa_uytkownika i haso to odpowiednia nazwa uytkownika i haso,
ktrych uywamy do czenia si z serwerem MySQL, tak jak w rozdziale 2., Wprowadzenie do systemu MySQL.
Jak ju wspomniano, gdy funkcje PHP s przywoywane, zazwyczaj zwracaj jak
warto. Czytelnikom, ktrzy nie pamitaj, przypominam, e chodzi o szczeg wymieniony w rozdziale 3., Wprowadzenie do jzyka PHP, gdy po raz pierwszy przywoywalimy funkcj. Poza wykonywaniem pewnego uytecznego zadania wikszo
funkcji zwraca rwnie jak warto. Warto t mona zachowa w zmiennej, by pniej korzysta z niej w skrypcie. Przedstawiona tutaj funkcja mysql_connect na przykad
zwraca liczb, ktra pozwala zidentyfikowa wanie ustanowione poczenie. Poniewa zamierzamy korzysta pniej z tego poczenia, powinnimy zachowa t warto. Oto praktyczny przykad takiego polecenia poczenia si z serwerem MySQL:
$dbcnx = mysql_connect('localhost', 'root', 'mypasswd');
Jak ju wspomniano, wartoci tych trzech parametrw funkcji mog si rni w zalenoci od serwera MySQL, z ktrym si czymy. Warto zwrci uwag na to, e
warto zwrcona przez funkcj mysql_connect (ktr bdziemy nazywa identyfikatorem poczenia) przechowywana jest w zmiennej $dbcnx.
Poniewa serwer MySQL jest zupenie niezalenym programem, musimy uwzgldni
sytuacj, w ktrej serwer bdzie z jakiego powodu niedostpny lub nieosigalny, na
przykad dlatego, e wystpiy jakie problemy z poczeniem sieciowym lub uylimy
niewaciwej kombinacji nazwy uytkownika i hasa. W takich przypadkach funkcja
mysql_connect nie zwrci identyfikatora poczenia (bo poczenie nie zostao nawizane), lecz warto false (fasz). Dziki temu moemy skorzysta z instrukcji if i odpowiednio zareagowa, gdy nie uda si nawiza poczenia:
$dbcnx = @mysql_connect('localhost', 'root', 'mypasswd');
if (!$dbcnx) {
echo '<p>W tej chwili nie mona nawiza ' .
'poczenia z serwerem bazy danych.</p>' );
exit();
}
80
W przedstawionym kodzie pojawiy si trzy nowe, warte uwagi sztuczki. Po pierwsze, przed nazw funkcji mysql_connect umiecilimy symbol @. Wiele funkcji, w tym
midzy innymi mysql_connect, w momencie niepowodzenie wywietla automatycznie
bardzo nieestetyczne komunikaty o bdach. Umieszczenie przed nazw funkcji symbolu @ zwanego rwnie operatorem supresji bdw (ang. error suppression operator) nakazuje jej zakoczy dziaanie po cichu, bez wywietlania standardowych
komunikatw o bdach, dajc nam tym samym szans przygotowania wasnego, bardziej przyjaznego komunikatu.
Drugi trik polega na umieszczeniu znaku wykrzyknika (!) przed nazw zmiennej $dbcnx
w warunku instrukcji if. Znak wykrzyknika jest operatorem negacji (ang. negation
operator), ktry po prostu zamienia warto logiczn true na warto false, a warto false na warto true. Dziki temu, jeli nie uda si nawiza poczenia i funkcja mysql_connect zwrci warto false, wyraenie !$sbcnx bdzie miao warto
true (zostanie rozpoznane jako prawda) i uruchomione zostan polecenia umieszczone w bloku instrukcji if. I przeciwnie, jeli poczenie zostanie nawizane, identyfikator poczenia przechowywany w zmiennej $dbcnx zostanie rozpoznany jako warto true (w jzyku PHP za warto prawda uznawane s wszystkie wartoci rne
od zera). Wyraenie !$dbcnx zostanie wic rozpoznane jako fasz, a zatem instrukcja
if nie zostanie wykonana.
Ostatni z nowych trikw to funkcja exit; jest ona jednoczenie pierwszym w tej ksice
przykadem funkcji, ktr mona przywoywa bez adnych parametrw. Jeli przywoamy j nie podajc adnych parametrw, to PHP przerwie w tym miejscu odczytywanie strony. Jest to cakiem dobra reakcja na nieudan prb nawizania poczenia z baz danych, poniewa w wikszoci przypadkw bez nawizania poczenia
i tak nie uda nam si wywietli na stronie adnych uytecznych informacji.
Podobnie jak w rozdziale 2., Wprowadzenie do systemu MySQL, gdy ju poczenie zostanie nawizane, kolejnym krokiem bdzie wybr bazy danych, z ktr chcemy pracowa. Zamy, e interesuje nas baza kawaw, ktr tworzylimy w rozdziale 2., Wprowadzenie do systemu MySQL. Baza ta nosia nazw ijdb. Wybr bazy
w kodzie PHP wymaga po prostu przywoania kolejnej funkcji:
mysql_select_db('ijdb', $dbcnx);
Warto zauway, e tym razem zamiast przypisywa warto zwrcon przez funkcj
do zmiennej i potem sprawdza, czy jest ona prawd, czy faszem, po prostu wykorzy-
81
Tutaj zapytanie bdzie po prostu acuchem tekstu zawierajcym polecenie SQL, ktre chcemy wykona. Podobnie jak w przypadku funkcji mysql_select_db, parametr
identyfikatora poczenia jest opcjonalny.
To, co ta funkcja zwrci, zaley ju od rodzaju wysanego zapytania. W przypadku
wikszoci polece SQL funkcja mysql_query zwraca warto true lub false, by zasygnalizowa (odpowiednio), czy zapytanie zostao wykonane z powodzeniem, czy
te nie. Przeanalizujmy nastpujcy przykad, w ktrym sprbujemy utworzy tabel
kawal, tak jak w rozdziale 2., Wprowadzenie do systemu MySQL:
$sql = 'CREATE TABLE kawal (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
tekstkawalu TEXT,
datakawalu DATE NOT NULL
)';
if (@mysql_query($sql)) {
echo '<p>Tabela kawal utworzona!</p>';
} else {
exit('<p>Nie udao si utworzy tabeli kawal: ' .
mysql_error() . '</p>');
}
82
Ponownie zastosowalimy trik z uyciem operatora @, aby zablokowa wszelkie automatyczne komunikaty o bdach zwracane przez funkcj mysql_query i zamiast tego
wywietli bardziej przyjazny komunikat o bdach. Uyta tutaj funkcja mysql_error
zwraca acuch tekstu, ktry opisuje ostatni komunikat o bdzie wysany przez serwer MySQL.
W przypadku zapyta DELETE, INSERT i UPDATE (su one do modyfikowania danych)
system MySQL notuje rwnie liczb wierszy tabeli (pozycji), ktre zostay zmienione przez zapytanie. Rozwamy takie zapytanie SQL, ktrego uywalimy ju w rozdziale 2., Wprowadzenie do systemu MySQL, by zmieni daty wszystkich kawaw,
zawierajcych sowo kurczak:
$sql = "UPDATE kawal SET datakawalu='1994-04-01'
WHERE tekstkawalu LIKE '%kurczak%'";
Zapytania SELECT traktowane s troch inaczej, poniewa pobieraj bardzo duo danych
i jzyk PHP musi dostarcza jakich sposobw obsugiwania tych informacji.
Obsuga zbiorw
wynikw zapytania SELECT
W przypadku wikszoci zapyta SQL funkcja mysql_query zwraca bdzie albo warto true (prawda, w przypadku sukcesu), albo false (fasz, w razie niepowodzenia).
Gdy jednak wykonujemy zapytanie SELECT, to nie wystarczy. Jak pamitamy, zapytania SELECT su do ogldania danych przechowywanych w bazie danych. Dlatego te
oprcz informacji, czy zapytanie zakoczyo si powodzeniem, czy nie, jzyk PHP
musi rwnie w jaki sposb odebra zwrcone wyniki zapytania. Dlatego te w przypadku zapytania SELECT funkcja mysql_query zwraca liczb bdc identyfikatorem
zbioru wynikw (ang. result set), ktry zawiera wszystkie wiersze (pozycje, rekordy)
zwrcone przez zapytanie. Jeli zapytanie z jakich powodw si nie powiedzie, zwracana jest warto false.
$result = @mysql_query('SELECT tekstkawalu FROM kawal');
if (!$result) {
exit('<p>Bd podczas wykonywania zapytania: ' . mysql_error() .
'</p>');
}
83
Warunek wykorzystany w ptli while nie przypomina warunkw, z ktrymi zetknlimy si do tej pory. Dlatego powic mu kilka sw wyjanienia. Przyjrzyjmy si
warunkowi tak, jak by by on osobn instrukcj:
$row = mysql_fetch_array($result);
Funkcja mysql_fetch_array przyjmuje jako parametr liczb identyfikujc zbir wynikw (w tym przypadku przechowywan w zmiennej $result) i zwraca kolejny wiersz
ze zbioru wynikw w postaci tablicy (wicej informacji na temat tablic mona znale
w rozdziale 3., Wprowadzenie do jzyka PHP). Gdy wreszcie funkcja mysql_fetch_
array dojdzie w zbiorze wynikw do koca i nie znajdzie kolejnego wiersza, zwrci
warto false.
Powysza instrukcja przypisuje zmiennej wiersza $row pewn warto, ale jednoczenie caa instrukcja przyjmuje t sam warto. To pozwala nam uy tej instrukcji jako warunku w ptli while. Poniewa ptla while bdzie wykonywana dopty, dopki
warunek nie przyjmie wartoci false, ptla ta bdzie wykonywana tak dugo, jak dugo funkcja mysql_fetch_array zdoa pobiera kolejne wiersze, a za kadym nawrotem
ptli zmiennej $row bdzie przypisywana warto kolejnego wiersza. Pozostaje nam
jedynie znale sposb na pobieranie w kadym nawrocie ptli wartoci zapisanych
w zmiennej tablicowej $row.
Wiersze wynikw zwracane przez funkcj mysql_fetch_array przechowywane s
w postaci tablic asocjacyjnych. Indeksami takiej tablicy bd nazwy kolejnych kolumn
tabeli zwracanych w zbiorze wynikw. Jeli zmienna $row reprezentuje pojedynczy
wiersz z naszego zbioru wynikw, to zapis $row['tekstkawalu'] odwoywa si bdzie do wartoci kolumny tekstkawalu w tym wierszu. Oto wic jak powinna wyglda ptla while, jeli chcielibymy wywietli tekst wszystkich kawaw przechowywanych w naszej bazie:
while ($row = mysql_fetch_array($result)) {
echo '<p>' . $row['tekstkawalu'] . '</p>';
}
Podsumowujc, poniej zosta przedstawiony kompletny kod PHP strony WWW, ktra bdzie si czy z nasz baz danych, pobiera tekst wszystkich kawaw w bazie
danych i wywietla je w osobnych akapitach HTML:
84
Rysunek 4.2 pokazuje wygld strony, gdy dodamy do naszej bazy kilka kawaw.
85
Rysunek 4.2.
Wszystkie pereki
z mojego
repertuaru
w jednym miejscu!
Rysunek 4.3 pokazuje, jak formularz ten bdzie wyglda w oknie przegldarki.
Tak jak poprzednio, formularz po zatwierdzeniu zaaduje waciwie t sam stron
(poniewa w atrybucie action formularza, definiujcym akcj podejmowan po jego
wypenieniu, uylimy zmiennej $_SERVER['PHP_SELF'] adujcej ten sam formularz
jeszcze raz), z jedn tylko rnic: do nowego dania zostanie dodana pewna zmienna. Zmienna ta, o nazwie joketext, bdzie zawiera tekst kawau, ktry zosta wpisany w polu tekstowym i pojawi si w tablicach $_POST i $_REQUEST automatycznie generowanych przez PHP.
86
Rysunek 4.3.
Kolejna pereka
humoru
wprowadzona
do bazy
Jedyna nowa sztuczka pojawiajca si w tym kodzie zostaa wytuszczona. Wykorzystujemy tutaj funkcj CURDATE() systemu MySQL, by przypisa kolumnie datakawalu
biec dat. System MySQL udostpnia wiele takich przydatnych funkcji, ale omwimy je dopiero wtedy, kiedy bd nam potrzebne. Dokadny opis funkcji oferowanych przez system MySQL mona znale w dodatku B, Funkcje MySQL.
Mamy ju wic kod, ktry umoliwi uytkownikowi wpisywanie kawaw do naszej
bazy danych. Pozostao nam jedynie doda go w wygodny sposb do naszej strony
prezentujcej list kawaw. Poniewa wikszo uytkownikw zapewne zechce tylko przejrze ju wpisane kaway, nie bdziemy zamieca im strony wielkim, brzydkim formularzem, chyba e kto wprost wyrazi zainteresowanie moliwoci dodania
nowego dowcipu. Z tego powodu nasz aplikacj najlepiej zaimplementowa jako stron wielozadaniow. Oto peny kod skryptu:
87
88
Praca domowa
Nasza praca domowa polega bdzie na umieszczeniu obok kadego akapitu z kawaem cza zatytuowanego Usu ten kawa, ktre po klikniciu usunie ten kawa
z bazy danych i wywietli now, zaktualizowana list dowcipw. Zanim do tego przystpimy, kilka podpowiedzi:
89
suy wanie do tego celu. Aby usun dowcip, naley wraz z daniem
usunicia kawau przesa rwnie jego identyfikator. Znakomitym miejscem
na umieszczenie tej wartoci jest acuch zapytania odpowiedniego cza Usu.
Ci, ktrym wydaje si, e ju znaj odpowied, albo te po prostu chcieliby znale
rozwizanie, powinni po prostu przewrci stron. Powodzenia!
Podsumowanie
W tym rozdziale poznalimy kilka nowych funkcji jzyka PHP, ktre umoliwiaj
wspprac z serwerem relacyjnych baz danych MySQL. Korzystajc z tych funkcji
zbudowalimy nasz pierwsz witryn WWW opart na bazie danych, ktra publikowaa w sieci nasz baz danych kawaw ijdb oraz pozwalaa uytkownikom na dodawanie do niej nowych artw.
W rozdziale 5., zatytuowanym Projektowanie relacyjnych baz danych, powrcimy
do wiersza polece systemu MySQL. Nauczymy si, jak realizowa zasady dobrego
projektowania baz danych oraz jak korzysta z bardziej zaawansowanych zapyta SQL,
by wywietla na stronie bardziej zoone informacje oraz umoliwi naszym uytkownikom podpisywanie kawaw swoim imieniem!
90
usuwamy. W tym celu bdziemy wstawia do kodu HTML cza Usu ten
kawa przy kadym z kawaw warto identyfikatora tego kawau pobran
z bazy danych.
Gdy strona bdzie adowana, korzystajc z instrukcji if sprawdzimy,
czy pozycji $_GET['deletejoke'] przypisana jest jaka konkretna warto
(uczynimy to za pomoc funkcji isset). Jeli tak, uyjemy wartoci przypisanej
91