You are on page 1of 21

IDZ DO

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

PHP i MySQL. Witryna WWW


oparta na bazie danych. Wydanie III
Autor: Kevin Yank
Tumaczenie: Sawomir Dzieniszewski, Pawe Janociski
ISBN: 83-7361-967-4
Tytu oryginau: Build Your Own Database Driven
Website Using PHP and MySQL, 3rd Edition
Format: B5, stron: 336
Zbuduj witryn WWW, do ktrej uytkownicy bd powraca codziennie
Zainstaluj i skonfiguruj PHP i MySQL
Poznaj zasady programowania w jzyku PHP
Zaprojektuj baz danych dla witryny WWW
Wywietl artykuy z bazy danych w oknie przegldarki internetowej
Co zrobi, eby wrd setek tysicy witryn WWW uytkownicy zapamitali wanie
nasz? Co sprawi, e bd do niej wraca? Atrakcyjny projekt graficzny to tylko jeden
z czynnikw wpywajcych na odbir witryny przez odwiedzajcych. Nawet najbardziej
profesjonalnie zaprojektowana grafika nie przycignie internautw na stron, na ktrej
dzie po dniu bd znajdowa te same informacje. W jaki sposb rozwiza kwesti
aktualizowania treci witryny? Edycja plikw HTML i mechanizmy SSI to rozwizania
zdajce egzamin w przypadku niewielkich serwisw WWW. Dla wikszych witryn
najlepszym rozwizaniem jest przechowywanie treci stron w bazie danych i stworzenie
mechanizmu pozwalajcego na ich atw modyfikacj.
Ksika PHP i MySQL. Witryna WWW oparta na bazie danych. Wydanie III to
przewodnik dla programistw, ktrzy chc stworzy wasny system zarzdzania treci
witryny WWW. Opisuje sposb realizacji takiego projektu za pomoc najpopularniejszej
obecnie technologii jzyka PHP i bazy danych MySQL. Przedstawia sposb instalacji
PHP i MySQL-a w rnych systemach operacyjnych oraz podstawy korzystania z bazy
danych i programowania w jzyku PHP. Nauczysz si przygotowywa struktur tabel
dla witryny WWW i tworzy skrypty PHP, za pomoc ktrych bdziesz mg edytowa,
formatowa i wywietla artykuy z bazy danych w oknie przegldarki WWW. Nauczysz
si te administrowa baz danych MySQL i korzysta z mechanizmw obsugi sesji w PHP.
Instalacja PHP i MySQL-a w Windows, Linuksie i Mac OS X
Praca z MySQL-em
Podstawowe zasady programowania w PHP
Projektowanie relacyjnej bazy danych dla witryny WWW
Tworzenie systemu edycji artykuw
Formatowanie tekstw i wywietlanie ich na stronie WWW
Budowanie zoonych zapyta w jzyku SQL
Korzystanie z danych binarnych w MySQL-u
Stosowanie mechanizmw obsugi sesji i cookies w PHP
Jeli chcesz, aby artykuy na Twojej witrynie WWW byy zawsze aktualne, wykorzystaj
system zarzdzania treci, ktry samodzielnie stworzysz.

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

Rozdzia 2. Wprowadzenie do systemu MySQL ................................................... 43


Wprowadzenie do baz danych ........................................................................................ 43
Logowanie si w systemie MySQL ................................................................................ 44
C to takiego ten SQL? ................................................................................................ 47
Tworzenie bazy danych .................................................................................................. 48
Tworzenie tabel .............................................................................................................. 48
Wstawianie danych do tabeli .......................................................................................... 50
Przegldanie danych przechowywanych w bazie ........................................................... 51
Modyfikowanie danych przechowywanych w bazie ...................................................... 53
Usuwanie danych przechowywanych w bazie ................................................................ 54
Podsumowanie ............................................................................................................... 54

Rozdzia 3. Wprowadzenie do jzyka PHP .......................................................... 55


Poznajemy jzyk PHP .................................................................................................... 55
Podstawowe polecenia i skadnia ................................................................................... 57
Zmienne i operatory ....................................................................................................... 59
Tablice ............................................................................................................................ 60
Interakcja z uytkownikiem i formularze ....................................................................... 61
Struktury sterujce .......................................................................................................... 67
Strony wielozadaniowe .................................................................................................. 71
Podsumowanie ............................................................................................................... 76

PHP i MySQL. Witryna WWW oparta na bazie danych

Rozdzia 4. Publikowanie w sieci WWW danych


przechowywanych w bazie MySQL ................................................... 77
Rzut oka na podstawowy mechanizm ............................................................................. 77
czenie si z baz MySQL za pomoc PHP ................................................................. 79
Wysyanie zapyta SQL za pomoc jzyka PHP ........................................................... 81
Obsuga zbiorw wynikw zapytania SELECT ............................................................. 82
Wstawianie danych do bazy ........................................................................................... 85
Praca domowa ................................................................................................................ 88
Podsumowanie ............................................................................................................... 89
Rozwizanie naszej pracy domowej ........................................................................... 89

Rozdzia 5. Projektowanie relacyjnych baz danych ............................................. 93


Umoliwianie autorom podpisywania kawaw ............................................................. 93
Prosta regua: rne dane trzeba przechowywa osobno ................................................ 95
Korzystanie z wielu tabel ............................................................................................... 97
Proste relacje ................................................................................................................ 101
Relacje typu wiele-do-wielu ......................................................................................... 103
Podsumowanie ............................................................................................................. 105

Rozdzia 6. System zarzdzania zawartoci .................................................... 107


Strona startowa systemu ............................................................................................... 108
Zarzdzanie autorami ................................................................................................... 110
Usuwanie autorw ........................................................................................................ 112
Dodawanie autorw ...................................................................................................... 114
Edytowanie rekordw autorw ..................................................................................... 115
Opcja Magic quotes ............................................................................................... 119
Zarzdzanie kategoriami .............................................................................................. 120
Zarzdzanie kawaami .................................................................................................. 125
Odszukiwanie kawaw ......................................................................................... 125
Dodawanie kawaw .............................................................................................. 130
Edytowanie i usuwanie kawaw ........................................................................... 137
Podsumowanie ............................................................................................................. 141

Rozdzia 7. Formatowanie i publikowanie zawartoci ....................................... 143


Pozbywamy si starej metody ...................................................................................... 144
Wyraenia regularne ..................................................................................................... 145
Formatowanie acuchw tekstu za pomoc wyrae regularnych .............................. 148
Wytuszczenie i kursywa ........................................................................................ 148
Akapity ................................................................................................................... 149
Hipercza .............................................................................................................. 149
Domykanie znacznikw ......................................................................................... 151
Dzielenie tekstu midzy strony .................................................................................... 154
Skadamy wszystkie elementy w jedn cao ............................................................. 156
Automatyczne zatwierdzanie zawartoci ...................................................................... 160
Podsumowanie ............................................................................................................. 162

Rozdzia 8. Administrowanie baz MySQL ........................................................ 163


Kopie zapasowe baz danych MySQL ........................................................................... 164
Wykonywanie kopii za pomoc programu mysqldump ......................................... 164
Kopie przyrostowe w dzienniku aktualizacji .......................................................... 165
Kontrola dostpu w MySQL ........................................................................................ 167
Polecenie GRANT ................................................................................................. 168
Polecenie REVOKE ............................................................................................... 171
Porady na temat kontroli dostpu ........................................................................... 171
Problem braku dostpu ........................................................................................... 173

Spis treci

7
Sprawdzanie i naprawianie plikw danych MySQL .................................................... 174
Podsumowanie ............................................................................................................. 177

Rozdzia 9. Zaawansowane zapytania SQL ...................................................... 179


Sortowanie wynikw zapytania SELECT .................................................................... 179
Ustawianie limitw dla zapyta ................................................................................... 181
Blokowanie tabel .......................................................................................................... 182
Transakcje w MySQL ............................................................................................ 184
Aliasy nazw kolumn i tabel .......................................................................................... 184
Grupowanie wynikw zapytania SELECT ................................................................... 186
Zczenie lewostronne .................................................................................................. 188
Ograniczanie wynikw klauzul HAVING .................................................................. 190
Podsumowanie ............................................................................................................. 191

Rozdzia 10. Dane binarne ................................................................................ 193


Czciowo dynamiczne strony WWW ......................................................................... 193
Obsuga adowania plikw ........................................................................................... 198
Przypisywanie plikom niepowtarzalnych nazw ..................................................... 200
Rejestrowanie w bazie danych adowanych plikw ..................................................... 202
Binarne typy kolumn .............................................................................................. 203
Zachowywanie plikw ........................................................................................... 204
Przegldanie zachowanych plikw ........................................................................ 205
Kompletny skrypt ......................................................................................................... 208
Problemy zwizane z wielkimi plikami ........................................................................ 212
Rozmiar pakietw MySQL .................................................................................... 212
Ograniczenia czasu dziaania skryptw PHP ......................................................... 213
Podsumowanie ............................................................................................................. 213

Rozdzia 11. Obsuga cookies i sesji w jzyku PHP ............................................ 215


Cookies ......................................................................................................................... 215
Obsuga sesji w PHP .................................................................................................... 219
Prosty koszyk na zakupy .............................................................................................. 221
Podsumowanie ............................................................................................................. 226

Rozdzia 12. Programowanie strukturalne w jzyku PHP .................................... 227


Czym jest kod strukturalny? ......................................................................................... 227
Potrzeba stosowania kodu strukturalnego .................................................................... 228
Doczanie plikw ........................................................................................................ 230
Rodzaje doczania ................................................................................................ 234
Doczanie zawartoci HTML ............................................................................... 235
Lokalizacja doczanych plikw ............................................................................ 236
Powrt do pliku gwnego ..................................................................................... 239
Funkcje uytkownika i biblioteki funkcji ..................................................................... 242
Zasig zmiennych i dostp do zmiennych globalnych ........................................... 245
Argumenty opcjonalne i nieograniczona lista argumentw .................................... 249
Stae .............................................................................................................................. 251
Struktura w praktyce kontrola dostpu .................................................................... 253
Podsumowanie ............................................................................................................. 260

Dodatek A Skadnia MySQL ........................................................................... 261


ALTER TABLE ........................................................................................................... 261
ANALYZE TABLE ..................................................................................................... 264
CREATE DATABASE ................................................................................................ 264
CREATE INDEX ......................................................................................................... 264
CREATE TABLE ........................................................................................................ 264

PHP i MySQL. Witryna WWW oparta na bazie danych


DELETE ....................................................................................................................... 266
DESCRIBE .................................................................................................................. 267
DROP DATABASE ..................................................................................................... 267
DROP INDEX .............................................................................................................. 267
DROP TABLE ............................................................................................................. 268
EXPLAIN ..................................................................................................................... 268
GRANT ........................................................................................................................ 268
INSERT ........................................................................................................................ 269
LOAD DATA INFILE ................................................................................................. 270
LOCK/UNLOCK TABLES ......................................................................................... 270
OPTIMIZE TABLE ..................................................................................................... 271
RENAME TABLE ....................................................................................................... 271
REPLACE .................................................................................................................... 272
REVOKE ...................................................................................................................... 272
SELECT ....................................................................................................................... 272
Zczenia ...................................................................................................................... 276
Unie .............................................................................................................................. 278
SET .............................................................................................................................. 278
SHOW .......................................................................................................................... 278
UNLOCK TABLES ..................................................................................................... 280
UPDATE ...................................................................................................................... 280
USE .............................................................................................................................. 280

Dodatek B Funkcje MySQL ............................................................................ 281


Funkcje przepywu sterowania ..................................................................................... 281
Funkcje matematyczne ................................................................................................. 282
Funkcje tekstowe .......................................................................................................... 285
Funkcje daty i czasu ..................................................................................................... 289
Funkcje agregujce ....................................................................................................... 294
Pozostae funkcje .......................................................................................................... 295

Dodatek C Typy danych dla kolumn tabel MySQL ............................................ 299


Typy liczbowe .............................................................................................................. 300
Typy znakowe .............................................................................................................. 302
Typy daty i czasu .......................................................................................................... 305

Dodatek D Funkcje PHP wsppracujce z MySQL .......................................... 307


mysql_affected_rows .................................................................................................... 307
mysql_client_encoding ................................................................................................. 308
mysql_close .................................................................................................................. 308
mysql_connect .............................................................................................................. 308
mysql_create_db ........................................................................................................... 309
mysql_data_seek .......................................................................................................... 309
mysql_db_name ........................................................................................................... 309
mysql_db_query ........................................................................................................... 309
mysql_drop_db ............................................................................................................. 310
mysql_errno .................................................................................................................. 310
mysql_error .................................................................................................................. 310
mysql_escape_string .................................................................................................... 310
mysql_fetch_array ........................................................................................................ 311
mysql_fetch_assoc ....................................................................................................... 311
mysql_fetch_field ......................................................................................................... 311
mysql_fetch_lengths ..................................................................................................... 311
mysql_fetch_object ...................................................................................................... 312
mysql_fetch_row .......................................................................................................... 312

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

Skorowidz ..................................................................................... 319

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!

Rzut oka na podstawowy mechanizm


Zanim przystpimy do dalszych rozwaa, warto przypomnie sobie, jaki jest nasz
gwny cel. Mamy do dyspozycji dwa wspaniae narzdzia: jzyk skryptowy PHP i system zarzdzania bazami danych MySQL. Pora teraz na nauk, jak poczy je ze sob.
Podstawowym celem tworzenia witryny WWW opartej na bazie danych jest przechowywanie zawartoci witryny w bazie danych, tak aby mona j byo stamtd pobiera
dynamicznie, tworzc na poczekaniu strony WWW, do ktrych uytkownicy witryny zyskaj dostp za pomoc zwykej przegldarki internetowej. Tak wic po jednej
stronie mamy odwiedzajcego, ktry pobiera stron za porednictwem przegldarki
internetowej i spodziewa si otrzyma standardowy dokument HTML. A po drugiej
stronie zawarto witryny, rozproszon po jednej lub wicej tabelach w bazie danych
MySQL, ktra to baza akceptuje tylko polecenia w formie zapyta SQL.

78

PHP i MySQL. Witryna WWW oparta na bazie danych

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

Aby przedstawi to jeszcze przejrzyciej, wyjanijmy, co dzieje si, gdy uytkownik


odwiedza nasz witryn WWW opart na bazie danych:
1. Przegldarka internetowa odwiedzajcego da strony WWW, wysyajc

standardowy adres URL.


2. Program serwera WWW (Apache, IIS czy jakiegokolwiek innego) ustala,

e dany plik jest skryptem PHP i serwer rozpoczyna interpretowanie pliku,


uywajc do tego celu wbudowanego moduu (dodatku) obsugujcego
jzyka PHP.
3. Odpowiednie polecenia PHP (ktrych musimy si dopiero nauczy) cz

si z baz danych MySQL i daj zawartoci, ktra powinna pojawi si


na przygotowywanej stronie WWW.
4. Baza danych MySQL odpowiada, przesyajc skryptowi PHP dan zawarto.
5. Skrypt PHP zapisuje pobran zawarto w jednej lub wicej zmiennych
PHP, a nastpnie za pomoc znanej ju nam instrukcji echo umieszcza

j w odpowiednich miejscach strony WWW.


6. Dodatek obsugujcy PHP koczy prac, zwracajc przygotowan przez

siebie stron kodu HTML serwerowi WWW.


7. Serwer WWW przesya t stron z kodem HTML do przegldarki

internetowej, tak jakby to by zwyky plik HTML. Nie przesya jednak


gotowego, statycznego pliku HTML, lecz kod zwrcony przez modu
interpretujcy skrypt PHP.

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL

79

czenie si z baz MySQL


za pomoc PHP
Zanim sprbujemy pobra z bazy danych MySQL tre, ktra zostanie opublikowana
na stronie WWW, musimy dowiedzie si, jak wewntrz skryptu PHP ustanowi poczenie z systemem MySQL. Jak pamitamy, w rozdziale 2., Wprowadzenie do systemu MySQL, korzystalimy z programu mysql, ktry pozwala nam nawizywa takie
poczenie wprost z wiersza polece. PHP jednak nie musi przywoywa adnego specjalnego programu, poniewa obsuga czenia si z serwerem MySQL jest bezporednio wbudowana w ten jzyk. Poczenie tworzy wbudowana funkcja mysql_connect.
mysql_connect(adres, nazwa_uytkownika, haso)

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

PHP i MySQL. Witryna WWW oparta na bazie danych

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);

Skorzystalimy zatem ze zmiennej $dbcnx, przechowujcej identyfikator poczenia


z baz danych, by poinformowa funkcj, z ktrego poczenia z baz danych powinna skorzysta. Prawd powiedziawszy parametr ten jest opcjonalny. Jeli go pominiemy, funkcja automatycznie skorzysta z identyfikatora ostatniego otwartego poczenia. Funkcja mysql_select_db zwraca warto true, jeli uda si jej poczy z baz
i false, jeli pojawi si jakie bdy. Podobnie jak poprzednio wyrazem rozwagi bdzie skorzystanie z instrukcji if, aby zareagowa na ewentualne bdy:
if (!@mysql_select_db('ijdb')) {
exit('<p>Nie mona w tej chwili ' .
'zlokalizowa bazy kawaw.</p>');
}

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-

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL

81

staem w warunku same przywoanie funkcji. Na pozr wyglda to troch nietypowo,


ale jest to do czsto uywany skrtowy zapis. Aby ustali, czy warunek jest speniony, czy nie, interpreter PHP wykona funkcj, a potem sprawdzi zwrcon przez ni
warto czyli zrobi wanie to, na czym nam zaley.
Kolejnym skrtem, ktry zastosowalimy, jest przywoanie funkcji exit z parametrem
w postaci acucha tekstu. Jeli przyzwiemy funkcj exit w ten sposb, zadziaa ona
podobnie jak instrukcja echo, z t tylko rnic, e zakoczy wykonywanie skryptu
po wywietleniu tekstu. Jednym sowem przywoanie funkcji exit z acuchem tekstu
jako parametrem jest odpowiednikiem uycia instrukcji echo, a nastpnie przywoania
funkcji exit bez adnych parametrw, tak jak w poprzednim przykadzie ilustrujcym
korzystanie z funkcji mysql_connect.
Gdy ju ustanowimy poczenie i wybierzemy odpowiedni baz danych, bdziemy
mogli skorzysta z danych przechowywanych w bazie.

Wysyanie zapyta SQL


za pomoc jzyka PHP
W rozdziale 2., Wprowadzenie do systemu MySQL, czylimy si z serwerem bazy danych MySQL za pomoc programu o nazwie mysql, ktry pozwala na wpisywanie zapyta (polece) SQL i natychmiastowe ogldanie ich wynikw. W jzyku PHP
istnieje cakiem podobny mechanizm, mianowicie funkcja mysql_query:
mysql_query(zapytanie[, identyfikator_poczenia])

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

PHP i MySQL. Witryna WWW oparta na bazie danych

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%'";

Kiedy wykonamy to zapytanie, bdziemy mogli skorzysta z funkcji mysql_affected_


rows, by pozna liczb wierszy, ktre zostay zmienione przez to zapytanie UPDATE:
if (@mysql_query($sql)) {
echo '<p>Zapytanie UPDATE aktualizowao ' . mysql_affected_rows() .
' wierszy.</p>';
} else {
exit('<p>Bd podczas aktualizacji z pomoc UPDATE: ' . mysql_error() .
'</p>');
}

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>');
}

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL

83

Zakadajc, e w trakcie przetwarzania nie pojawi si aden bd, przedstawiony kod


zapisze w zmiennej $result pewn liczb. Liczba ta odpowiada zbiorowi wynikw
zawierajcemu teksty wszystkich kawaw przechowywanych w tabeli kawal. Poniewa nie ma praktycznie adnych ogranicze co do liczby dowcipw przechowywanych
w bazie, zwrcony zbir wynikw moe by cakiem pokany.
Jak ju wspomniano, ptla while jest bardzo przydatn struktur sterujc, gdy musimy pracowa z duymi zestawami danych. Oto szkic kodu, ktry umoliwi przetwarzanie jeden po drugim kolejnych wierszy w zbiorze wynikw:
while ($row = mysql_fetch_array($result)) {
// przetwarzaj odpowiednio wiersz...
}

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

PHP i MySQL. Witryna WWW oparta na bazie danych

Listing 4.1. jokelist.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Nasza lista kawaw</title>
<meta http-equiv="content-type"
content="text/html; charset=iso-8859-2" />
</head>
<body>
<?php
// Pocz si z serwerem bazy danych
$dbcnx = @mysql_connect('localhost', 'root', 'mypasswd');
if (!$dbcnx) {
exit('<p>W tej chwili nie mona nawiza ' .
'poczenia z serwerem bazy danych.</p>' );
}
// Wybierz baz danych z kawaami
if (!@mysql_select_db('ijdb')) {
exit('<p><p>Nie mona w tej chwili ' .
'zlokalizowa bazy kawaw.</p>');
}
?>
<p>Oto lista wszystkich kawaw w naszej bazie danych:</p>
<blockquote>
<?php
// Zadaj tekstu wszystkich kawaw
$result = @mysql_query('SELECT tekstkawalu FROM kawal');
if (!$result) {
exit('<p> Bd podczas wykonywania zapytania: ' . mysql_error() . '</p>');
}
// Wywietl tekst kadego kawau w osobnym akapicie
while ($row = mysql_fetch_array($result)) {
echo '<p>' . $row['tekstkawalu'] . '</p>';
}
?>
</blockquote>
</body>
</html>

Rysunek 4.2 pokazuje wygld strony, gdy dodamy do naszej bazy kilka kawaw.

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL

85

Rysunek 4.2.
Wszystkie pereki
z mojego
repertuaru
w jednym miejscu!

Wstawianie danych do bazy


W tej czci rozdziau zostan przedstawione narzdzia, ktre umoliwiaj odwiedzajcym dodawanie kolejnych kawaw do naszej bazy danych. Ambitni czytelnicy mog podj prb samodzielnego rozwizania zadania, zanim jeszcze przystpi do dalszej lektury. Zaprezentuj wprawdzie troch nowego materiau, ale nasza aplikacja
bdzie gwnie korzysta z rozwiza, z ktrymi zetknlimy si ju do tej pory.
Aby umoliwi odwiedzajcym dodawanie nowych kawaw do bazy, oczywicie potrzebny nam bdzie odpowiedni formularz. Oto kod formularza, ktry speni to zadanie:
Listing 4.2. jokes.php (fragment)
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label>Wpisz tutaj swj kawa:<br />
<textarea name="tekstkawalu" rows="10" cols="40">
</textarea></label><br />
<input type="submit" value="AKCEPTUJ" />
</form>

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

PHP i MySQL. Witryna WWW oparta na bazie danych

Rysunek 4.3.
Kolejna pereka
humoru
wprowadzona
do bazy

Aby wstawi zatwierdzony kawa do bazy danych, skorzystamy z funkcji mysql_query,


by za jej pomoc uruchomi zapytanie INSERT. Wykorzystuje ono warto przechowywan w polu $_POST['tekstkawalu'], by umieci odpowiedni tekst w kolumnie
tekstkawalu przywoanej w zapytaniu:
Listing 4.3. jokes.php (fragment)
if (isset($_POST['tekstkawalu'])) {
$joketext = $_POST['tekstkawalu'];
$sql = "INSERT INTO kawal SET
tekstkawalu='$joketext',
datakawalu=CURDATE()";
if (@mysql_query($sql)) {
echo '<p>Twj kawa zosta dodany.</p>';
} else {
echo '<p>Bd podczas dodawania kawau: ' .
mysql_error() . '</p>';
}
}

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:

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL


Listing 4.4. jokes.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Internetowa baza kawaw</title>
<meta http-equiv="content-type"
content="text/html; charset=iso-8859-2" />
</head>
<body>
<?php if (isset($_GET['addjoke'])): // Uytkownik chce doda kawa
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label>Wpisz tutaj swj kawa:<br />
<textarea name="tekstkawalu" rows="10" cols="40">
</textarea></label><br />
<input type="submit" value="AKCEPTUJ" />
</form>
<?php else: // Jeli nie, wywietlamy domyln stron
// Pocz si z serwerem bazy danych
$dbcnx = @mysql_connect('localhost', 'root', 'mypasswd');
if (!$dbcnx) {
exit('<p>W tej chwili nie mona nawiza ' .
'poczenia z serwerem bazy danych.</p>' );
}
// Wybierz baz danych z kawaami
if (!@mysql_select_db('ijdb')) {
exit('<p><p>Nie mona w tej chwili ' .
'zlokalizowa bazy kawaw.</p>');
}
// Jeli uytkownik wprowadzi kawa,
// dodaj art do bazy danych.
if (isset($_POST['tekstkawalu'])) {
$joketext = $_POST['tekstkawalu'];
$sql = "INSERT INTO kawal SET
tekstkawalu='$joketext',
datakawalu=CURDATE()";
if (@mysql_query($sql)) {
echo '<p>Twj kawa zosta dodany.</p>';
} else {
echo '<p>Bd podczas dodawania kawau: ' .
mysql_error() . '</p>';
}
}
echo '<p>Oto lista wszystkich kawaw w naszej bazie danych:</p>';
// Zadaj tekstu wszystkich kawaw
$result = @mysql_query('SELECT tekstkawalu FROM kawal');
if (!$result) {
exit('<p> Bd podczas wykonywania zapytania: ' . mysql_error() . '</p>');

87

88

PHP i MySQL. Witryna WWW oparta na bazie danych


}
// Wywietl tekst kadego kawau w osobnym akapicie
while ($row = mysql_fetch_array($result)) {
echo '<p>' . $row['tekstkawalu'] . '</p>';
}
// To cze po klikniciu wywietli stron
// z formularzem umoliwiajcym dodanie kawau.
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
'?addjoke=1">Dodaj swj kawa!</a></p>';
endif;
?>
</body>
</html>

Warto gwoli testu zaadowa t stron do swojej przegldarki i sprbowa doda do


bazy kawa lub dwa. Strona, ktra powinna si pojawi po dodaniu dowcipu, zostaa
pokazana na rysunku 4.4.
Rysunek 4.4.
Patrz mamciu!
adnego SQL-a!

I o to chodzi! Za pomoc pojedynczego pliku zawierajcego do prosty kod PHP


moemy dodawa do naszej bazy MySQL nowe kaway i oglda te, ktre ju si tam
znajduj.

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:

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL

89

Mona to nadal bez problemu zrobi na jednej wielozadaniowej stronie WWW.


Konieczne bdzie skorzystanie z polecenia DELETE jzyka SQL, za pomoc

ktrego usuwalimy ju obiekty z bazy w rozdziale 2. Wprowadzenie do


systemu MySQL.
I kwestia najtrudniejsza: aby usun ten a nie inny kawa, konieczne bdzie
jednoznaczne zidentyfikowanie go. Kolumna identyfikatora id w tabeli kawal

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!

Rozwizanie naszej pracy domowej


Przedstawiam rozwizanie pracy domowej zaproponowanej powyej. Oto zmiany
wprowadzone w poprzednim skrypcie PHP, ktre umoliwi dodanie cza Usu ten
kawa obok kadego z kawaw na stronie:
W poprzednim przykadzie przesyalimy zmienn addjoke z czem Dodaj

swj kawa! umieszczonym u dou strony, sygnalizujc w ten sposb skryptowi


PHP, e zamiast zwykej listy kawaw powinien wywietli formularz
umoliwiajcy dodanie kolejnego. W podobny sposb przelemy zmienn
deletejoke wraz z czem Usu ten kawa, by zasygnalizowa, e dany kawa
powinien zosta usunity.
Dla kadego kawau powinnimy wraz z zawartoci kolumny tekstkawalu
pobiera z bazy danych warto kolumny id, eby wiedzie, jaki identyfikator

ma kady z kawaw zapisanych w bazie i wywietlonych na stronie.

90

PHP i MySQL. Witryna WWW oparta na bazie danych


W zmiennej $_GET['deletejoke'] zapiszemy identyfikator kawau, ktry

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

tej pozycji (czyli identyfikatora kawau, ktry ma zosta usunity) w zapytaniu


DELETE jzyka SQL, ktre usunie odpowiedni kawa.
Oto kompletny kod rozwizania. W razie jakichkolwiek wtpliwoci warto zasign
informacji na SitePoint Forums (http://www.sitepoint.com/forums/)!
Listing 4.5. challenge.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Internetowa baza kawaw</title>
<meta http-equiv="content-type"
content="text/html; charset=iso-8859-2" />
</head>
<body>
<?php if (isset($_GET['addjoke'])): // Uytkownik chce doda kawa
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label>Wpisz tutaj swj kawa:<br />
<textarea name="tekstkawalu" rows="10" cols="40">
</textarea></label><br />
<input type="submit" value="AKCEPTUJ" />
</form>
<?php else: // Jeli nie, wywietlamy domyln stron
// Pocz si z serwerem bazy danych
$dbcnx = @mysql_connect('localhost', 'root', 'mypasswd');
if (!$dbcnx) {
exit('<p>W tej chwili nie mona nawiza ' .
'poczenia z serwerem bazy danych.</p>' );
}
// Wybierz baz danych z kawaami
if (!@mysql_select_db('ijdb')) {
exit('<p><p>Nie mona w tej chwili ' .
'zlokalizowa bazy kawaw.</p>');
}
// Jeli uytkownik wprowadzi kawa,
// dodaj art do bazy danych.
if (isset($_POST['tekstkawalu'])) {
$joketext = $_POST['tekstkawalu'];
$sql = "INSERT INTO kawal SET
tekstkawalu='$joketext',

Rozdzia 4. Publikowanie w sieci WWW danych przechowywanych w bazie MySQL


datakawalu=CURDATE()";
if (@mysql_query($sql)) {
echo '<p>Twj kawa zosta dodany.</p>';
} else {
echo '<p>Bd podczas dodawania kawau: ' .
mysql_error() . '</p>';
}
}
// Jeli kawa ma by wyrzucony,
// usu go z bazy danych.
if (isset($_GET['deletejoke'])) {
$jokeid = $_GET['deletejoke'];
$sql = "DELETE FROM kawal
WHERE id=$jokeid";
if (@mysql_query($sql)) {
echo '<p>Kawa zosta usunity.</p>';
} else {
echo '<p>Bd podczas usuwania kawau: ' .
mysql_error() . '</p>';
}
}
echo '<p>Oto lista wszystkich kawaw w naszej bazie danych:</p>';
// Zadaj tekstu wszystkich kawaw
$result = @mysql_query('SELECT tekstkawalu FROM kawal');
if (!$result) {
exit('<p> Bd podczas wykonywania zapytania: ' . mysql_error() . '</p>');
}
// Wywietl tekst kadego kawau w osobnym akapicie
// umieszczajc obok cze "Usu ten kawa".
while ($row = mysql_fetch_array($result)) {
$jokeid = $row['id'];
$joketext = $row['joketext'];
echo '<p>' . $joketext .
' <a href="' . $_SERVER['PHP_SELF'] .
'?deletejoke=' . $jokeid . '">' .
'Usu ten kawa</a></p>';
}
// To cze po klikniciu wywietli stron
// z formularzem umoliwiajcym dodanie kawau.
echo '<p><a href="' . $_SERVER['PHP_SELF'] .
'?addjoke=1">Dodaj kawa!</a></p>';
endif;
?>
</body>
</html>

91

You might also like