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
Wprowadzenie ..........................................................................................................................................17
Dla kogo przeznaczona jest ta ksika? ......................................................................... 17
O PHP ......................................................................................................................... 18
Ukad ksiki ............................................................................................................... 19
Zanim zaczniesz .......................................................................................................... 20
Podzikowania ............................................................................................................. 20
Cz I Podstawy PHP
21
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Spis treci
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
189
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Spis treci
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
287
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Spis treci
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
10
379
10
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Spis treci
11
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
11
12
12
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Spis treci
13
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
13
14
655
14
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Spis treci
15
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
15
16
Dodatki
779
16
D:\ROBOCZ~1\MAKIET~1\PHPIMY~1\09DRUK~1\R00_0_spis.doc
Podczas wykonywania operacji na danych zawsze trzeba dba o zachowanie spjnoci i integralnoci danych. O ile system zarzdzania baz danych zapewnia bezpieczne wprowadzanie
danych do tabel i pobieranie z nich informacji, nie moe zagwarantowa, e dane zapisane
w bazie zawsze bd miay sens. Przykadowo, jeli zaznaczylimy w tabeli zawierajcej
informacje o ksikach, e sprzedalimy trzy ksiki klientowi, ale przed zapisaniem zamwienia w odpowiedniej tabeli nastpia awaria zasilania, baza danych bdzie zawieraa niespjne informacje. Moe rwnie wystpi problem rywalizacji, kiedy dwch uytkownikw
jednoczenie sprbuje kupi ostatni egzemplarz ksiki. W najgorszym przypadku moe si
zdarzy, e zamwienie zo obaj uytkownicy.
(17-05-06) 249
250
Problem
Przeanalizujmy dokadniej przykad ksigarni online. Wyobramy sobie, e utworzono prymitywn tabel zawierajc dane o wszystkich produktach przeznaczonych na sprzeda oraz
tabel opisujc zamwienia. Dla uproszczenia zakadamy, e mona zakupi tylko jeden
typ ksiek. W przykadzie wykorzystamy zdefiniowane poniej tabele i pominiemy wiele
szczegw zamwie, takich jak informacje o wysyce, cenie oraz patnociach.
CREATE TABLE Products
(
pid INTEGER AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
isbn VARCHAR(200) NOT NULL,
price NUMERIC(10,2) NOT NULL,
number_in_stock INTEGER NOT NULL
)
ENGINE = InnoDB;
CREATE TABLE Orders
(
order_id INTEGER AUTO_INCREMENT PRIMARY KEY,
order_date DATETIME NOT NULL,
user_id INTEGER NOT NULL,
product INTEGER NOT NULL,
num_units INTEGER NOT NULL,
FOREIGN KEY(user_id) REFERENCES Users(user_id),
FOREIGN KEY(product) REFERENCES Products(pid)
)
ENGINE = InnoDB;
Problem powstanie w przypadku, gdy pierwsze zapytanie wykona si pomylnie, ale drugie
z jakichkolwiek przyczyn nie zostanie wykonane. Taka sytuacja moe si zdarzy z ktregokolwiek z nastpujcych powodw:
n
250 (17-05-06)
251
Wielu Czytelnikw zapewne wzrusza w tej chwili ramionami, mwic taka sytuacja nie
moe mi si przytrafi. Jeli jednak wemiemy za przykad due aplikacje internetowe,
przetwarzajce tysice, jeli nie miliony transakcji dziennie, przekonamy si, e takie sytuacje zdarzaj si, a klienci oczekuj, e powstae problemy zostan rozwizane w rozsdny
i niekopotliwy sposb. W powyszym przykadzie na szczcie klient nie zosta obciony za
co, czego nie otrzyma, ale byoby lepiej, gdyby aplikacja moga automatycznie wykrywa
awarie i odtwarza brakujce pozycje w polu number_in_stock tabeli Products.
Rozwizanie
Majc na uwadze moliwe problemy, wprowadzimy pojcie transakcji. Jest to mechanizm
pozwalajcy na grupowanie wielu zapyta i instrukcji SQL w jedn niepodzieln operacj
w bazie danych. Albo jest wykonywana i akceptowana (zatwierdzana) caa grupa instrukcji,
albo adna z nich i wtedy skutki operacji s wycofywane. W rzeczywistoci taki mechanizm
jest bardziej skomplikowany ni si wydaje na pierwszy rzut oka. System zarzdzania relacyjn
baz danych obsugujcy transakcje musi spenia tzw. reguy ACID:
n
Wszystkie bazy danych omawiane w tej ksice obsuguj transakcje. W systemie MySQL
trzeba jednak zwrci uwag na wykorzystywany typ tabeli. Jeli tabele zostay utworzone
z wykorzystaniem mechanizmu zapisu MyISAM, transakcje nie bd obsugiwane. W tej
ksice wszdzie tam, gdzie bdziemy wykorzystywa transakcje, zastosujemy mechanizm
zapisu InnoDB.
Niektre serwery obsuguj rne poziomy izolacji transakcji. Wikszo obsuguje cztery poziomy. Na najniszym poziomie (ktry jednoczenie jest najszybszy) transakcje maj
moliwo odczytywania postpu i biecego stanu innych transakcji. Na najwyszym poziomie transakcje s cakowicie od siebie odseparowane (poziom najwolniejszy). Istnienie
tych poziomw mona potraktowa jako przyznanie si do potrzeby kompromisu pomidzy
poziomem izolacji transakcji a wydajnoci aplikacji. Dla naszych potrzeb odpowiedni poziom izolacji zapewnia poziom domylny dla wikszoci serwerw baz danych omawianych
(17-05-06) 251
252
Pisanie transakcji
Sposb oznaczania pocztku transakcji jest rny dla rnych serwerw baz danych, jednak
w przypadku wikszoci z nich transakcje rozpoczyna si prost instrukcj:
BEGIN;
Aby anulowa transakcj i cofn wykonane w niej operacje, naley zastosowa nastpujc
instrukcj:
ROLLBACK;
252 (17-05-06)
253
Nasz nowy problem wystpi w przypadku, gdy dwch uytkownikw naszej aplikacji prbuje zakupi t sam ksik w tym samym czasie. Poniej zaprezentuj sekwencj operacji
wykonywanych przez obu uytkownikw w przyblieniu w tym samym czasie.
Uytkownik 1. rozpoczyna proces zakupu. Wykonuj si nastpujce instrukcje:
[Uytkownik 1]
BEGIN
SELECT number_in_stock FROM Products WHERE pid = 343;
Odjcie 1 od wartoci number_in_stock i ustawienie jej na now warto (tu oznaczymy j jako "nowa")
(17-05-06) 253
254
Uytkownik numer 1 pomylnie zakupi ksik. Kiedy drugi uytkownik sprbuje j zakupi
za pomoc nastpujcego kodu:
[Uytkownik 2.]
UPDATE Products SET number_in_stock = nowa WHERE pid = 343;
INSERT INTO Orders(order_date, user_id, product, num_units)
VALUES (NOW(), 4538, 343, 1);
COMMIT;
wykonanie zapytania UPDATE powiedzie si, ale nie spowoduje aktualizacji wierszy w tabeli!
Wynika to z faktu, i program obsugujcy transakcj serwera bazy danych stwierdzi, e dane
ulegy zmianie i nie pozwoli drugiemu procesowi ich zmodyfikowa. To jednak nie powoduje
zgoszenia bdu. W kodzie musimy teraz wprowadzi dodatkowe instrukcje, ktre wykryj,
czy interesujcy nas wiersz zosta zmodyfikowany i w takiej sytuacji anuluj transakcj lub
ponowi prb aktualizacji, jeli modyfikacja nie nastpia.
Istnieje jednak o wiele bardziej eleganckie rozwizanie, polegajce na zastosowaniu zmodyfikowanej instrukcji SELECT: SELECT... FOR UPDATE. W przypadku pobrania wartoci
wiersza za pomoc tego zapytania jednoczenie wskazujemy, e mamy zamiar zmodyfikowa w nim dane. W tej sytuacji inne transakcje lub uytkownicy prbujcy uzyska dostp
do danych zostan zablokowani do czasu zakoczenia transakcji. Teraz moemy przepisa
nasz kod w nastpujcy sposb:
BEGIN
SELECT number_in_stock FROM Products
WHERE pid = 343 FOR UPDATE;
Odjcie 1 od wartoci number_in_stock i ustawienie jej na now warto (tu oznaczymy j jako "nowa")
UPDATE Products SET number_in_stock = nowa WHERE pid = 343;
INSERT INTO Orders(order_date, user_id, product, num_units)
VALUES (NOW(), 4538, 343, 1);
Jeli doszlimy do tego miejsca bez bdw:
COMMIT;
W innym przypadku, jeli wystpiy bdy:
ROLLBACK;
254 (17-05-06)
255
Dziki wprowadzeniu klauzuli FOR UPDATE wszystkie inne procesy prbujce uzyska dostp
do tej samej wartoci bd musiay czeka na wywoanie instrukcji COMMIT lub ROLLBACK.
To eliminuje problem rywalizacji o zakup ostatniej ksiki.
Dla transakcji istniej bardziej zaawansowane mechanizmy blokowania, ale w tej ksice nie
bdziemy pisali na tyle skomplikowanych programw, aby mogy by potrzebne. Przykady
transakcji zaprezentuj w czci V Przykadowe projekty i dalsze pomysy.
Do tej pory omwiem podstawowe zapytania SQL, jednak moliwoci jzyka s o wiele
wiksze. W tym podrozdziale opisz niektre bardziej zaawansowane wasnoci jzyka SQL.
czenie wyrae
Sowo kluczowe WHERE umoliwia wprowadzenie warunkw ograniczajcych zakres zwracanych wierszy przez niektre zapytania, w tym SELECT, UPDATE i DELETE. Wczeniej uywalimy prostych wyrae o postaci:
NazwaKolumny operator warto
Wyraenia mona jednak czy ze sob i w ten sposb formuowa bardziej zoone warunki. Do tego celu su sowa kluczowe AND i OR. Ich dziaanie jest podobne do dziaania
operatorw AND i OR w innych jzykach programowania. Wynik operacji AND jest prawdziwy,
jeli s spenione warunki po obu stronach operatora, natomiast wynik operacji OR jest prawdziwy, jeli jest speniony ktrykolwiek warunek po dowolnej stronie operatora. Dziki zastosowaniu operatorw AND i OR mona dowolnie formuowa zapytania. Na przykad, aby znale
wszystkich uytkownikw o imieniu Grayna, ktrzy urodzili si po roku 1980, mona wykorzysta nastpujce zapytanie:
SELECT user_name, user_email FROM Users
WHERE full_name LIKE 'Grayna%'
AND birthdate >= '1980-01-01';
W poczeniach wielu wyrae tego typu mona i naley stosowa nawiasy, ktre objaniaj
kolejno sprawdzania warunkw:
SELECT user_name, full_name, birthdate FROM Users
WHERE (full_name LIKE 'Bogdan%' OR full_name LIKE 'Bogusaw%')
AND birthdate >= '1980-01-01';
(17-05-06) 255
256
W przypadku cigw znakw jest nieco gorzej. Jak wspominaem wczeniej, do okrelenia
zakresu cigw znakw serwer bazy danych wykorzystuje zdefiniowany porzdek sortowania. Dziki zdefiniowaniu porzdku sortowania mona okreli sposb porzdkowania
nie tylko danych w jzyku angielskim, ale take w innych jzykach. Tak wic nastpujce
zapytanie:
SELECT * FROM Users
WHERE user_name BETWEEN 'a' AND 'm';
character_set_database;
Powysza instrukcja ustawia take porzdek sortowania na domylny dla wybranego zestawu
znakw. Porzdek sortowania mona rwnie wprowadzi w osobnej instrukcji w nastpujcy
sposb:
mysml> set collation_connection =
collation_database;
Dodatkow komplikacj jest fakt, i niektre serwery baz danych interpretuj zakresy wartoci
zdefiniowane w klauzuli BETWEEN wcznie z wartociami granicznymi, natomiast inne nie
uwzgldniaj tych wartoci. Przed skorzystaniem ze sowa kluczowego BETWEEN naley upewni
si, w jaki sposb s interpretowane granice zakresu (we wszystkich bazach danych omawianych w tej ksice granice przedziaw wchodz w skad zakresu).
256 (17-05-06)
257
moe spowodowa wywietlenie wielu powtrze nazw forw, na ktrych publikowano wicej
ni jedn wiadomo. Jeli jednak interesuje nas lista forw, na ktrych opublikowano co
najmniej jedn wiadomo, moemy w jzyku SQL zastosowa zapytanie SELECT DISTINCT:
SELECT DISTINCT forum_id FROM Messages;
Funkcje agregacji funkcje, ktre przetwarzaj zbir wartoci (na przykad wartoci
danych w kolumnie tabeli) i zwracaj pojedyncz warto skalarn. Przykadem
mog by funkcje obliczajce sum wartoci w kolumnie lub ich redni arytmetyczn.
W wyraeniach mona stosowa wycznie funkcje skalarne. Funkcje agregacji mona wykorzysta do przetwarzania wynikw zapytania przed ich zwrceniem do uytkownika.
Najczciej stosuje si je w odniesieniu do wynikw instrukcji SELECT.
Niestety, funkcje stanowi kolejny obszar, w ktrym poszczeglne serwery baz danych bardzo
si rni pomidzy sob. Cho zestaw wasnoci funkcjonalnych jest podobny, nazwy funkcji
i sposb ich uywania bardzo si rni pomidzy poszczeglnymi serwerami. W tym rozdziale
postaram si opisa najpopularniejsze funkcje dla najpopularniejszych serwerw. W przypadku,
gdy rozbienoci bd zbyt wielkie, przedstawi wersj dla bazy danych MySQL (zwizy
opis odpowiednikw dla innych serwerw baz danych mona znale w dodatku B Odpowiedniki funkcji obsugi baz danych).
(17-05-06) 257
258
Dobrze
le
Funkcje numeryczne
Rozpoczn od opisania kilku funkcji numerycznych, poniewa s one najbardziej zrozumiale
i najatwiejsze w uyciu. Wszystkie opisane poniej funkcje to funkcje agregacji, ktre wykorzystamy do przetwarzania zbioru wierszy w zapytaniu w celu uzyskania pojedynczej wartoci.
COUNT
Funkcj COUNT mona wykorzysta na dwa sposoby: COUNT(NazwaKolumny) lub COUNT(*).
Pierwszy sposb wywoania zlicza w zestawie wynikw liczb wartoci okrelonej kolumny
rnych od NULL. W drugiej wersji funkcja COUNT zlicza liczb wierszy w zestawie wynikw.
Na przykad instrukcja:
SELECT COUNT(*) FROM Users;
zlicza uytkownikw w tabeli Users. Aby policzy uytkownikw w tabeli Users, ktrych
nazwiska s rne od NULL (co przy naszym schemacie tabeli jest dozwolone), mona wykorzysta nastpujce zapytanie:
mysml> SELECT COUNT(full_name) from Users;
+------------------+
| count(full_name) |
+------------------+
|
4 |
+------------------+
1 row in set (1.26 sec)
SUM
Aby w zestawie wynikw uzyska sum wartoci zawartych w okrelonej kolumnie, mona
skorzysta z funkcji SUM. Gdybymy mieli tabel z informacjami o pogodzie w okrelonym
miejscu i chcieli obliczy cakowit warto opadw w 2002 roku, moglibymy wykona
nastpujce zapytanie:
SELECT SUM(daily_precip) FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';
MAX i MIN
Aby obliczy maksymaln lub minimaln warto kolumny w zestawie wynikw, mona
skorzysta z funkcji MAX i MIN. Kontynuujc nasz przykad bazy danych o pogodzie z poprzedniego punktu, aby znale dni w 2002 roku, w ktrych wystpiy najwiksze i najmniejsze
opady, moemy skorzysta z nastpujcych zapyta:
258 (17-05-06)
259
Powysze dwa zapytania mona poczy w jedno. Zestaw wynikw takiego zapytania bdzie
skada si z dwch kolumn:
SELECT MAX(daily_precip), MIN(daily_precip)
FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';
AVG
Aby obliczy redni arytmetyczn wartoci w kolumnie, mona skorzysta z funkcji AVG.
Wykorzystuje si j w nastpujcy sposb:
SELECT AVG(daily_precip) FROM DailyWeatherReports
WHERE date BETWEEN '2002-01-01' AND '2002-12-31';
Funkcje znakowe
W jzyku SQL wystpuje wiele przydatnych funkcji przetwarzania cigw znakw. Wikszo
z nich to funkcje skalarne, ktre mona wykorzysta w wielu przypadkach.
Wydzielanie podcigw
Aby wydzieli cz cigu znakw w jzyku SQL, mona skorzysta z funkcji SUBSTRING
(w systemie Oracle SUBSTR). Funkcja pobiera trzy argumenty: warto (nazw kolumny),
z ktrej ma by wydzielony podcig, indeks pierwszego znaku podcigu oraz liczb znakw
do wydzielenia.
Uwaga
W odrnieniu od jzyka PHP, gdzie indeksy maj wartoci poczwszy od 0, indeksy
w cigach znakw w jzyku SQL liczy si od 1. Oznacza to, e pierwszy znak w cigu
ma indeks 1.
Aby pobra pierwszych 5 znakw z kadego wiersza tabeli zawierajcej nazwy wszystkich
stanw w USA i prowincji w Kanadzie, mona wykona nastpujce zapytanie:
SELECT SUBSTRING(name, 1, 5) FROM states_provinces;
Aby znale stany i prowincje, ktrych nazwy zaczynaj si od sekwencji New, mona wykona nastpujce zapytanie:
SELECT * FROM states_provinces
WHERE SUBSTRING(name, 1, 3) = 'New';
(17-05-06) 259
260
Jeli szukany cig nie zostanie odnaleziony, funkcja INSTR zwraca warto 0.
Aby na podstawie zawartoci tabeli Users uzyska sformatowany cig znakw skadajcy
si z nazwy uytkownika i adresu e-mail, mona wykona nastpujce zapytanie:
SELECT CONCAT('Nazwa uytkownika: ',
user_name,
' tAdres e-mail:',
user_email)
FROM Users;
260 (17-05-06)
261
Now
Aby odczyta biec dat i godzin w systemie MySQL i PostgreSQL, mona skorzysta
z funkcji NOW.
SELECT NOW();
INSERT INTO Orders (prodid, user_id, when)
VALUES(445455423, 32345, Now());
Parametr cig_formatu to sekwencja znakw, ktre s zastpowane odpowiednimi wartociami dotyczcymi daty. Na przykad:
mysml> SELECT full_name, DATE_FORMAT(birthdate, '%W %D %M %Y')
-> FROM Users
-> WHERE birthdate <> '000-00-00';
+--------------------------------+---------------------------------------+
| full_name
| DATE_FORMAT(birthdate, '%W %D %M %Y') |
+--------------------------------+---------------------------------------+
| Krzysztof Malinowski
| Tuesday 16th December 1980
|
| Akira Tanaka
| Wednesday 13th September 0000
|
| Patrycja Dominikowska
| Monday 31st March 1975
|
+--------------------------------+---------------------------------------+
3 rows in set (0.00 sec)
(17-05-06) 261
262
Znaczenie
%W
Dzie tygodnia w jzyku serwera bazy danych (czsto jest nim jzyk angielski).
%w
%Y
Rok wedug kalendarza juliaskiego przedstawiony za pomoc 4 cyfr (na przykad 1999).
%y
Rok wedug kalendarza juliaskiego przedstawiony za pomoc 2 cyfr (na przykad 33).
%M
Nazwa miesica w jzyku serwera bazy danych (czsto jest nim jzyk angielski).
%m
%D
%d
%H
%h
%p
Przyrostek AM bd PM.
%i
%S lub %s
Klauzula GROUP BY razem ze skalarn funkcj YEAR umoliwia pogrupowanie tabeli wedug
wsplnych wartoci roku, a nastpnie wykonanie funkcji AVG dla wszystkich wierszy z poszczeglnych grup. Zapytanie mona jeszcze bardziej ucili za pomoc klauzuli HAVING,
ktra jest nieco podobna do klauzuli WHERE, ale dotyczy warunkw ograniczajcych dla podklauzuli GROUP BY. Przykadowo, aby uzyska list lat, w ktrych rednia warto opadw
przekroczya 50 mm, mona wykorzysta nastpujce zapytanie:
262 (17-05-06)
263
Dziki moliwoci czenia powyszych wasnoci mona tworzy niezwykle skomplikowane zapytania. Na przykad, aby uzyska redni warto opadw dla lat 1990 2000 dla
wszystkich miast o rocznej redniej wartoci opadw przekraczajcej 50 mm, mona wykorzysta nastpujce zapytanie:
SELECT YEAR(date), AVG(daily_precip)
FROM DailyWeatherReports
WHERE YEAR(date) BETWEEN 1990 AND 2000
GROUP BY YEAR(date)
HAVING AVG(daily_precip) > 50;
W pewnych sytuacjach trzeba doda bd usun kolumn z tabeli. Mona to zrobi za pomoc
instrukcji ALTER TABLE, ktra ma wiele moliwych zastosowa. W tym podrozdziale zademonstruj najczciej stosowane:
ALTER TABLE NazwaTabeli
ADD NazwaKolumny TypKolumny atrybuty...;
ALTER TABLE NazwaTabeli
DROP COLUMN NazwaKolumny;
ALTER TABLE NazwaTabeli
CHANGE COLUMN NazwaKolumny Nowe_szczegy;
ALTER TABLE NazwaTabeli
RENAME AS NowaNazwaTabeli;
Modyfikowanie schematu tabeli jest operacj, ktrej nie naley wykonywa czsto. Trzeba
mie pewno, e wykonywane dziaania s prawidowe. Celem projektowania jest utworzenie struktury bazy danych, ktra jest wydajna, elastyczna, skalowalna i zapewni spenienie potrzeb uytkownikw w przyszoci. Jeli zbyt czsto musimy modyfikowa schematy
tabel, moe to oznacza konieczno powtrnego przeprowadzenia procesu projektowania
tabel. Poza tym, modyfikowanie schematu tabel jest operacj kosztown. W niektrych
systemach baz danych usunicie kolumny wymaga duej iloci miejsca na dysku. Czsto
tabela jest zablokowana przez cay czas usuwania niepotrzebnych danych. Podobne, mniej
lub bardziej przejciowe problemy z wydajnoci, mog si zdarzy w przypadku dodawania
nowych kolumn.
Aby doda kolumn, naley skorzysta z klauzuli ADD i wprowadzi nazw nowej kolumny,
jej typ danych oraz inne atrybuty. Na przykad, aby w tabeli Users doda pole password suce
do zapisywania hase, mona wykorzysta nastpujce zapytanie:
ALTER TABLE Users
ADD password VARCHAR(50) NOT NULL;
(17-05-06) 263
264
Aby usun kolumn z tabeli, naley skorzysta z klauzuli DROP COLUMN. Na przykad, aby
usun kolumn password, ktr dodalimy przed chwil, mona wykorzysta nastpujce
zapytanie:
ALTER TABLE Users
DROP COLUMN password;
Podobnie jak inne operacje, ktre powoduj usuwanie informacji z bazy danych, usunicie
kolumny jest trwae i nie mona go cofn. Dlatego wanie takie polecenia musz by uywane
ze szczegln ostronoci (i raczej nie naley zezwala na ich wykonywanie zwykym uytkownikom bazy danych).
Do zmiany definicji kolumny suy klauzula CHANGE (klauzul rwnowan jest MODIFY).
W przypadku wprowadzenia nazwy w nowej definicji kolumny, kolumna zostanie przemianowana. Klauzul CHANGE mona rwnie wykorzysta do zmiany typu oraz atrybutw kolumny. Przykadowo, aby zmieni typ pola user_name w tabeli Users na cig 100-znakowy,
mona wykorzysta nastpujce zapytanie:
ALTER TABLE Users
CHANGE COLUMN user_name VARCHAR(100) NOT NULL;
Instrukcj ALTER TABLE mog wykonywa tylko uytkownicy posiadajcy uprawnienie ALTER.
Po lekturze tego rozdziau Czytelnik rozszerzy swoj wiedz na temat jzyka SQL. Wykorzystalimy go do wykonywania coraz bardziej skomplikowanych zapyta i operacji na danych.
Dziki zastosowaniu transakcji mona wykona wiele instrukcji SQL w formie niepodzielnej
operacji. Podczas obsugi transakcji mona stosowa rne poziomy izolacji i blokowania. Po
lekturze tego rozdziau Czytelnik powinien wiedzie, w jaki sposb mona kwalifikowa
i sortowa dane, wykorzystywa funkcje, a take modyfikowa schemat tabel (pamitajc
o kosztach tej operacji).
Po lekturze ostatnich czterech rozdziaw dysponujemy wystarczajc wiedz na temat baz
danych, aby zacz z nich korzysta z poziomu kodu PHP. W nastpnym rozdziale przedstawi sposoby nawizywania poczenia z serwerem, wykonywania zapyta i przegldania
wynikw z poziomu naszej aplikacji internetowej.
264 (17-05-06)