CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
PHP
(cz. 3)
CO NOWEGO W
PHP5
Wszystkie przykłady opisane w artykule
znajdują się na dołączonej płycie CD
w katalogu Warsztat_PHP.
Bazy danych
W ostatniej częSci wprowadzenia do PHP5 nie można modyfikować dotychczasowych struktur tabeli za
pomocą składni ALTER TABLE, choć jest to problem możliwy
skupimy się na tematyce obsługi baz
do obejScia,
brak jest możliwoSci tworzenia obcych kluczy,
danych w PHP5. Korzystanie z baz danych
widoki pracują tylko w trybie do odczytu,
w językach skryptowych jest obecnie
nie działają polecenia RIGHT OUTER JOIN i FULL OUTER
JOIN,
tak oczywiste, że nie sposób wyobrazić
następuje blokowanie dostępu do pliku bazy danych podczas
zapisu.
sobie strony, która nie wykorzystywałaby
baz danych. Lecz o ile w PHP4 dominował
Baza SQLite jest przede wszystkim znakomitym substytutem
dla płaskich baz danych i jest w stanie wyprzeć je w całoSci. Pła-
model LAMP Linux Apache MySQL PHP,
skie bazy danych to wszelkiego rodzaju pliki tekstowe, które mają
służyć do nieskomplikowanego przechowywania danych. Kolejne
o tyle w PHP5 mamy do czynienia z trendem
rekordy w takich bazach oddziela znak nowej linii, natomiast kolej-
ku zmianom.
ne rekordy oddziela się według upodobania autora rozwiązania, np.
tabulatorem.
SQLite ma szanse odnieSć sukces głównie dlatego, że jest rozwią-
Paweł Grzesiak
zaniem dostępnym domySlnie wraz z PHP5. Za jego szansami na suk-
ces przemawia wiele faktów:
SQLite
SQLite posiada sporo cech, które odróżniają to rozwiązanie od typo- prostota korzystania,
wych baz danych. Niektórzy lubią ją okreSlać jako plikową bazę da- brak koniecznoSci instalacji i konfiguracji,
nych. Do przechowywania wszystkich danych wykorzystuje ona bo- wydajnoSć, szczególnie w transakcjach,
wiem pliki. Gdy tworzymy bazę danych w SQLite, tworzymy plik na tymczasowe bazy tworzone w pamięci serwera,
dysku serwera, który póxniej otwieramy i wykonujemy na nim zapyta- interfejs użytkownika zbliżony do MySQL.
nia. To rozszerzenie PHP5 jest więc czymS w rodzaju miniaturowej ba-
zy danych, która nie potrzebuje otwierać osobnych procesów, by mogła O SQLite Czytelnicy MI mieli już okazję się dowiedzieć z artyku-
pracować. Co więcej, w PHP5 baza SQLite dostępna jest domySlnie, łów opublikowanych w numerach 4 i 5/2004. W pierwszej częSci zna-
nie musimy więc niczego już instalować. Instalujemy PHP5, a wraz lazło się szczegółowe omówienie zastosowań i możliwoSci SQLite.
z nim dostajemy w pełni działającą bazę danych. Za pomocą rozszerze- Druga częSć to praktyczna prezentacja możliwoSci SQLite wraz
nia SQLite możemy utworzyć w dowolnej chwili nową bazę danych. z przykładami realizacji poszczególnych zadań. Dlatego też w trzeciej
SQLite utworzy plik na dysku serwera, dokładnie o takiej nazwie jaką częSci kursu wprowadzającego do PHP5 nakreSlone zostaną jedynie
sami ustalimy. Następnie możemy wykonać na tej bazie zapytania, np. podstawowe zagadnienia dotyczące pracy z SQLite w sposób obiekto-
dodać nowe tabele do bazy wraz z danymi. SQLite jest niemal w 100% wy, ponieważ praca z SQLite w paradygmacie obiektowym jest do-
zgodny z językiem SQL92. Bez przeszkód wykonamy dowolne zapyta- stępna dopiero od PHP5. Artykuł z maja prezentował jedynie przykła-
nia typu SELECT, UPDATE, INSERT, stworzymy własne funkcje dy w formie proceduralnej, dostępne zarówno w PHP4, jak i w PHP5.
(piszemy je w PHP, a póxniej wykorzystujemy podczas pracy z SQLi-
te), widoki, zapytania podrzędne, przełączniki, transakcje. Interfejs obiektowy
SQLite to baza opierająca się o pliki tekstowe, ma więc kilka wad, W PHP5 ma dominować interfejs obiektowy. Do jego obsługi został
które charakteryzują tego typu rozwiązania: przystosowany również i interfejs bazy SQLite:
UWAGA!
100 INTERNET.listopad.2004
Poprzednie części tego cyklu
są na płycie CD!
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
$sqlite = new SQLiteDatabase( jakasbaza.sqlite ); $sqlite = new SQLiteDatabase( :memory: );
$sqlite->query( CREATE TABLE jakastabela $sqlite->query( CREATE TABLE jakastabela
(id INTEGER PRIMARY KEY, a, b); (id INTEGER PRIMARY KEY, a, b);
INSERT INTO jakastabela (a,b) VALUES INSERT INTO jakastabela (a,b) VALUES
( abcd , 1.43 ); ); ( abcd , 1.43 ) );
echo Ostatnio dodany ID: .$sqlite-> echo Ostatnio dodany ID: .$sqlite->lastInsertRowid();
lastInsertRowid(); $array = $sqlite->arrayQuery( SELECT * FROM
$array = $sqlite->arrayQuery( SELECT * FROM jakastabela WHERE id = 1 , SQLITE_ASSOC);
jakastabela WHERE id = 1 , SQLITE_ASSOC); print_r($array);
print_r($array); ?>
?>
Przykład jest niemal identyczny jak poprzedni. Jedyną różnicą jest to, że
Nowy obiekt bazy danych SQLite tworzymy poprzez utworzenie SQLite tworzy bazę w pamięci serwera, co zasygnalizowaliSmy bazie po-
instancji klasy SQLiteDatabase, podając przy tym parametr w postaci przez wprowadzenie do konstruktora parametru :memory: . Wraz z zakoń-
nazwy pliku bazy danych. Jeżeli plik ten nie istnieje, baza danych o ta- czeniem tego skryptu cała baza zostanie bezpowrotnie usunięta z pamięci.
kiej nazwie zostanie utworzona na dysku serwera. W przykładzie za
pomocą metody query() tworzymy tabelę składającą się z trzech ko- MySQL
lumn. Pierwsza kolumna jest typu INTEGER PRIMARY KEY, co od- W dziedzinie obsługi bazy danych MySQL dokonało się wiele poważ-
powiada MySQLowemu typowi auto_increment. Pozostałe kolumny nych zmian. W PHP5 do dyspozycji mamy teraz dwa rozszerzenia do
nie posiadają typu, ponieważ SQLite nie wymaga ich podawania. Dla obsługi MySQL:
SQLite jest całkowicie obojętnie jaki typ danych podamy, bowiem ta
baza ich nie używa. Posiada własne mechanizmy, które przy sortowa- mysql, czyli stara proceduralna biblioteka do obsługi MySQL,
niu danych wykryją jakiego typu danych jest kolumna i podejdą do mysqli, czyli całkowicie nowa biblioteka obsługująca zarówno
kwestii sortowania w sposób doSć specyficzny (o czym była mowa paradygmat obiektowy, jak i proceduralny, przeznaczona do pra-
w artykule SQLite cz. 2 , MI 5/2004). Ponieważ podczas jednego cy z bazą MySQL 4.1 lub nowszą.
wywołania metody query() można wykonać dowolną iloSć zapytań,
oprócz utworzenia tabeli wprowadzamy do niej ponadto jeden przykła- NowoSci związane z rozszerzeniem mysqli:
dowy rekord. Następna linia przykładu, zawierająca wywołanie meto- zapytania przygotowane (prepared statements),
dy lasInsertRowId(), zwróci identyfikator liczbowy ostatnio dodanego możliwoSć wykonywania wielu zapytań przy użyciu jednej funkcji
wiersza. Kolejno skorzystamy z metody arrayQuery, która jest swoje- (multi-querying),
go rodzaju kompilacją metod query() i fetch_array(). Pierwszym para- bezpieczne połączenia przy użyciu SSL.
metrem przy wywoływaniu tej metody jest zapytanie, natomiast dru-
gim sposób odbioru danych (tu: tablica asocjacyjna). Wynikiem dzia- Instalacja mysqli
łania tej metody jest tablica asocjacyjna, którą wySwietlamy na ekranie By zainstalować rozszerzenie mysqli w Srodowisku Windows należy:
przy użyciu print_r.
1. Odnalexć plik konfiguracyjny php.ini (ulokowany najczęSciej
Wynik realizacji powyższego przykładu jest następujący: w katalogu z instalacją PHP) i edytować go.
2. Poszukać sekcji: Dynamic Extensions , a następnie linii:
Ostatnio dodany ID: 1 ;extension=ext/php_mysqli.dll .
Array 3. Usunąć Srednik (znak komentarza) i zapisać plik.
( 4. Przekopiować plik libmysqli.dll z głównego katalogu z instalacją
[0] => Array PHP do katalogu system32 (najczęSciej c:\windows\system32\).
( 5. Zrestartować/uruchomić serwer Apache.
[id] => 1 6. Sprawdzić za pomocą funkcji phpinfo(), czy rozszerzenie zostało
[a] => abcd poprawnie załadowane (czy widnieje na liScie zainstalowanych
[b] => 1.43 rozszerzeń).
)
) mysqli
Nowa biblioteka do obsługi bazy MySQL to odpowiedx na wzrastające moż-
Praca z SQLite jest zbliżona do pracy z MySQL. Zmiany w nazew- liwoSci MySQL. Głównymi zaletami nowego, udoskonalonego rozszerzenia
nictwie w interfejsie obiektowym spowodowały jednak niewielką nie- jest przede wszystkim większa wydajnoSć, nawet 40-krotnia w porównaniu ze
zgodnoSć nazw w porównaniu z poprzednim stanem. starym rozszerzeniem. Dzieje się tak za sprawą przepisanego od nowa kodu.
Interesująco prezentują się też możliwoSci obiektowego interfejsu mysqli,
Bazy typu :memory: bowiem każdą z trzech klas interfejsu można rozszerzać poprzez dziedzicze-
Bardzo interesującą właSciwoScią bazy danych SQLite jest możliwoSć nie. Możliwe jest też stworzenie własnej, efektywniejszej obsługi błędów.
tworzenia baz danych, które zostaną ulokowane w pamięci serwera. Są Jak zapewniają autorzy nowego rozszerzenia mysqli, także i bez-
one szczególnie przydatne, gdy musimy dokonać obróbki jakichS da- pieczeństwo uległo radykalnej zmianie. Stary system wymiany haseł
nych, a nie chcemy do tego celu tworzyć klasycznej bazy danych zapi- między bazą a klientem został przebudowany i jest odporny na ataki
sanej na dysku twardym serwera. Wówczas bazy typu :memory: niczym protokół SSH. Nie bez znaczenia dla bezpieczeństwa jest także
dostarczą potrzebnych narzędzi, jednoczeSnie nie stwarzając potrzeby możliwoSć tworzenia zapytań przygotowanych. Utrudniają one znacz-
lokowania bazy na dysku serwera, lecz w jego ulotnej pamięci. W pro- nie tworzenie ataków typu SQL Injection (więcej o typach ataków
sty sposób można utworzyć bazę danych typu :memory: : w artykule Bezpieczeństwo PHP MI 2/2004).
INTERNET.listopad.2004 101
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
PHP
PrzejScie z jednego rozszerzenia na drugie jest bardzo proste. Jeżeli $query = $conn->query( SELECT a, b FROM
porównać interfejsy proceduralne obu rozszerzeń, to są one bardzo do jakastabela ORDER BY id LIMIT 5 );
siebie zbliżone: while($data = $query->fetch_assoc()) {
print_r($data);
$conn = mysqli_connect( localhost , user , echo $conn->affected_rows;
password , test ); $conn->close();
if(!$conn) ?>
die();
$query = mysqli_query($conn, SELECT a, b FROM W pierwszej kolejnoSci tworzymy nowy obiekt, podając mu za pa-
jakastabela ORDER BY id LIMIT 5 ); rametry wszystkie dane dotyczące połączenia. Następnie wywołujemy
while($data = mysqli_fetch_assoc($query)) { metodę query() i nie istnieje już potrzeba przekazywania uchwytu.
print_r($data); Przy metodzie fetch_assoc() należy zwrócić uwagę na to, że operuje-
} my już na zupełnie innym obiekcie. Nie jest to, jak poprzednio, obiekt
echo mysqli_affected_rows($conn); $conn, lecz obiekt $query. W interfejsie obiektowym rozszerzenia my-
mysqli_close($conn); sqli dysponujemy bowiem trzema klasami:
?>
klasa mysqli jest wykorzystywana do nawiązywania relacji mię-
Jak łatwo dostrzec, nowe rozszerzenie różni się tylko symbolicznie. dzy PHP ó MySQL,
PrzejScie ze starego na nowe powinno więc być łatwe, o ile zadbamy o: klasa mysql_result pozwala na obsługę wyników (stąd
fech_assoc(), korzysta z obiektu $query, utworzonego przez
przemianowanie funkcji z mysql_ na mysqli_, metodę query() obiektu $conn),
wstawienie uchwytu połączenia jako parametru wymaganego. klasa mysql_stmt dedykowana jest zapytaniom przygotowanym.
Interfejs obiektowy PrzejScie ze starego interfejsu proceduralnego na nowy interfejs
Przyjrzyjmy się teraz przykładowi, który zrobi dokładnie to samo, lecz obiektowy będzie wymagało znacznie więcej pracy, niż przejScie ze
tym razem skorzystamy z interfejsu obiektowego: starego na nowy interfejs proceduralny. Dlatego też interfejs obiekto-
wy przewidziany jest do stosowania w oprogramowaniu (skryptach)
$conn = new mysqli( localhost , user ,
password , test ); Zapytania przygotowane
if(!$conn) Wraz z rozszerzeniem mysqli wprowadza się pojęcie zapytania przy-
die(); gotowanego, które do tej pory było nieznane programistom operują-
KLASA NAZWA OPIS ZWRACA
mysqli affected_rows właściwość zwraca ilość zmian dokonanych w rekordach mixed
przy wykorzystaniu zapytań z rodziny INSERT, UPDATE lub DELETE.
mysqli autocommit(bool tryb) metoda włącza lub wyłącza auto-commit bool
mysqli close() metoda zamyka połączenie z bazą bool
mysqli commit() metoda zatwierdza bieżącą transakcję bool
mysqli connect(*) metoda otwiera nowe połączenie z bazą danych obiekt (połączenie)
mysqli errno właściwość zwraca kod błędu ostatniego błędnego zapytania integer
mysqli error właściwość zwraca opis błędu dokonanego string
w ostatnim błędnym zapytaniu
mysqli field_count właściwość zwraca ilość kolumn zwróconych integer
przez ostatnie dokonane zapytanie
mysqli info() metoda dostarcza informacji o ostatnio wykonanym zapytaniu string
mysqli insert_id właściwość zwraca ID ostatnio utworzonego rekordu 0 lub integer ID
mysqli mysqli(*) konstruktor klasy mysqli; parametry są opcjonalne obiekt (połączenie)
mysqli prepare (string zapytanie) metoda przygotowuje zapytanie do wykonania obiekt stmt lub fałsz (jeżeli błąd)
mysqli query (string zapytanie [, int tryb_wyniku]) wykonuje zapytanie na bazie danych prawda/obiekt lub fałsz (jeżeli błąd)
mysqli rollback() metoda cofa aktualną transakcję bool
mysqli select_db (string baza) metoda zmienia/wybiera bazę danych bool
mysqli_stmt bind_param(object stmt, string metoda przypisuje wartości do wskazanego bool
typy, mixed &dane1 [, mixed &...])) przygotowanego zapytania
mysqli_stmt bind_result(object stmt, mixed metoda przypisuje zmienne bool
&dane1 [, mixed &...]) do przygotowanego zapytania
mysqli_stmt close() metoda zamyka przygotowane zapytanie bool
mysqli_stmt execute(object stmt) metoda wykonuje przygotowane zapytanie bool
mysqli_stmt prepare (string zapytanie) metoda przygotowuje zapytanie do wykonania obiekt stmt lub fałsz (jeżeli błąd)
mysqli_result fetch_array([int typ wyniku]) zwraca numeryczną, asocjacyjną lub numeryczną tablica lub NULL
i asocjacyjną tablicę z wierszem wyników
mysqli_result fetch_assoc() zwraca tablicę asocjacyjną z wierszem wyników tablica asocjacyjna lub NULL
mysqli_result fetch_field() na podstawie wyniku zapytania zwraca informację obiekt lub fałsz
o kolejnej kolumnie w postaci obiektu
mysqli_result fetch_fields() ma podstawie wyniku zapytania zwraca informację tablica obiektów lub fałsz
o kolumnach w postaci obiektu
mysqli_result fetch_object() zwraca wiersz wyników w postaci obiektu wypełnionego danymi obiekt lub NULL
mysqli_result fetch_row() zwraca tablicę numeryczną z wierszem wyników tablica lub NULL
mysqli_result free() czyści z pamięci dane związane z wynikiem void
* [string host [, string uzytkownik [, string haslo [, string baza [, int port [, string gniazdo]]]]]]
102 INTERNET.listopad.2004
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
cym na bazie MySQL, a doskonale znane używającym baz Oracle.
Idea tego rodzaju zapytań jest prosta, a zarazem skuteczna. Przy ich
użyciu możemy tworzyć zapytania przygotowane oparte o praktycznie
wszystkie elementy języka SQL. NajczęSciej z zapytań przygotowa-
nych korzysta się przy wprowadzaniu danych (INSERT), ich aktuali-
zacji (UPDATE), ale także przy pobieraniu (SELECT) i usuwaniu
(DELETE).
Gdy tworzymy zapytanie typu INSERT, do sekcji VALUES wpro-
wadzamy informacje, które chcemy dodać do tabeli. Podobne zapyta-
nie powtarzamy tyle razy, ile informacji mamy do dodania. Przy czym
za każdym razem do sekcji VALUES wprowadzamy inne dane. Tak
podstępujemy, gdy chcemy wprowadzić jakieS dane do bazy:
INSERT INTO jakastabela (a, b) VALUES ( abcd , 1.24 )
INSERT INTO jakastabela (a, b) VALUES ( efgh , 6.32 )
GdybySmy miejsca, które ulegają zmianie zastąpili znakiem zapy-
tania, wyglądałoby to tak:
INSERT INTO jakastabela (a, b) VALUES (?, ?) foreach($dane as $d) {
$stmt->bind_param( sd , $d[ a ], $d[ b ]);
Zapytanie przygotowane jest to najogólniej mówiąc szablon, do $stmt->execute();
którego póxniej będziemy wprowadzali dane w miejsce znaków zapy- }
tania. Powyższy przykład wysyłamy do bazy danych MySQL, by mo- ?>
gła go sobie sprawdzić na obecnoSć błędów składni i zapisać w spe-
cjalnym buforze. Z powrotem MySQL odda nam uchwyt do tego za- Dane, które mamy zamiar wprowadzić do bazy danych, miesz-
pytania, bySmy go mogli póxniej wykorzystać. Gdy zechcemy wpro- czą się w tablicy $dane. W pierwszej kolejnoSci wykonujemy meto-
wadzić jakieS dane do tabeli, wystarczy do bazy danych przesłać tylko dę prepare(), która ma za zadanie przygotować zapytanie do póx-
te dane, które wejdą w miejsce znaków zapytania. niejszego wykorzystania. Szablon posiada dwa znaki zapytania,
Taka metoda działania daje spore korzySci. Po pierwsze baza da- czyli o tyleż zmiennych zostanie uzupełniony. Do przypisywania
nych nie musi za każdym razem sprawdzać zapytania na obecnoSć błę- parametrów związanych służy metoda bind_param(). Drugi i każdy
dów. Wystarczy, że zrobi to raz, bo zapytanie się nie zmienia. Zmianie kolejny parametr oznaczają wartoSci, o które kolejno zostanie uzu-
ulegają tylko te dane, które wprowadzamy za pomocą znaków zapyta- pełniony szablon w miejsce ? . Pierwszy parametr to coS nowego.
nia. Ponieważ dane te trafiają do bazy pozbawione pozostałej częSci Definiuje on jakiego typu danych są zmienne uzupełniające sza-
zapytania, mają mniejszą objętoSć, a co za tym idzie można je przesłać blon. Kolejne znaki odpowiadają typom danych kolejnych znaków
szybciej. Biblioteka mysqli przy wysyłaniu tych danych zoptymalizuje zapytania, czyli naszych zmiennych. Po co to wszystko? By biblio-
je jeszcze odpowiednio, by jak najmniej zajmowały i jak najszybciej teka mysqli mogła wybrać najbardziej optymalny dla niej sposób
dotarły do bazy. Taki sposób wykonywania zapytań cechuje się ponad- transmisji danych do bazy danych. Poszczególne litery tłumaczy się
to zwiększonym bezpieczeństwem. Mysqli samodzielnie zneutralizuje jako następujące typy:
znaki, które mogą być kłopotliwe, odciążając programistę od tego obo-
wiązku. i wszystkie typy INT,
Podsumowując: ogólna idea przemawiająca za stosowaniem zapy- d DOUBLE i FLOAT,
tań przygotowanych to uzyskanie maksymalnego przyspieszenia przy b BLOBy,
wykonywaniu serii zapytań poprzez: s wszystkie pozostałe typy.
stworzenie szablonów zapytań, które są kompilowane i spraw- Ponieważ pierwsza zmienna wprowadzana do tabeli jest ciągiem
dzane, znaków, czyli stringiem, korzystamy z litery s . Skoro zaS druga
uzupełnienie szablonów, co pozwala na nie przesyłanie pełnego zmienna to liczba zmiennoprzecinkowa, używamy litery d . Tak
zapytania, lecz tylko zmieniających się danych. powstaje pierwszy parametr metody bind_param(), czyli sd . Po
przypisaniu danych do zapytania można go wykonać za pomocą
Efektem jest mniejsza iloSć przesłanych danych pomiędzy bazą da- metody execute(). W ten sposób pętla wykona łącznie dwa razy za-
nych a klientem oraz większa prędkoSć działania dzięki już skompilo- pytanie, co spowoduje dodanie dwóch rekordów do bazy danych.
wanym szablonom. Jak to wygląda na przykładzie kodu? Przy czym należy zwrócić uwagę, że pracujemy nie na klasie my-
sql, lecz na mysql_stmt. Moment w którym tworzymy obiekt tej
$conn = new mysqli( localhost , user , wyłącznie na obiekcie klasy mysql_stmt. Załączona tabela prezen-
password , test ); tuje wybrane metody i właSciwoSci wszystkich trzech klas do ob-
$dane[0][ a ] = wxyz ; sługi MySQL.
$dane[0][ b ] = 1.65;
$dane[1][ a ] = wxyz ; Zapytania przygotowane pobieranie wyników
$dane[1][ b ] = 1.65; Stworzenie zapytań przygotowanych możliwe jest również w przypad-
$stmt = $conn->prepare( INSERT INTO ku pobierania. Zobaczmy to na przykładzie pobierania danych przy
jakastabela (a, b) VALUES (?, ?) ); użyciu składni polecenia SELECT:
INTERNET.listopad.2004 103
CMYK
NA CD NEWSY Z OKŁADKI FIRMA MAGAZYN PROGRAMY WARSZTAT
PHP
$conn = new mysqli( localhost , user , dzonej transakcji wszystko OK, transakcja zakończyła się suk-
password , test ); cesem, zapomnij o niej,
$stmt = $conn->prepare( SELECT a, b FROM rollback() cofa wszystkie zapytania, które zostały wykonane pod-
jakastabela ORDER BY id ); czas transakcji unieważnia transakcję.
$stmt->execute();
$stmt->bind_result($a, $b); Zobaczmy wszystkie metody w akcji:
while($stmt->fetch()) {
echo $a.$b; } $conn = new mysqli( localhost , user ,
$stmt->close(); password , test );
?> $conn->autocommit(false);
$a = $conn->query( INSERT INTO jakastabela
Przygotowujemy typowe zapytanie za pomocą metody prepare(). (a, b) VALUES ( defg , 1.32) );
Jak łatwo zauważyć, zapytanie to nie posiada znaków ? . Dlacze- $b = $conn->query( INSERT INTO jakastabela
go? Ponieważ nie będzie posiadało żadnych innych wariantów. To (a, b) VALUES ( hijk , 3.35) );
z kolei oznacza, że za każdym razem będziemy pobierali dane przy $c = $conn->query( INSERT INTO jakastabela
użyciu tego samego zapytania. Zapytanie przygotowane wykonuje- (a, b) VALUES ( lmno , 2.97) );
my, czyli przekazujemy za pomocą metody execute() do serwera. if($a & $b & $c) {
NowoScią w stosunku poprzednich przykładów jest metoda bind_re- echo ok! ;
sult(), używana niejako zamiast bind_param(). Jej parametry $conn->commit();
($a, $b) to kolejne kolumny z zapytania. Wiersz wyniku pochodzący }
z kolumny o nazwie a zostanie przypisany do zmiennej $a, wiersz else {
b do zmiennej $b. Metoda close() służy do oczyszczenia pamięci echo błąd! ;
bazy z informacji na temat wskazanego zapytania przygotowanego. $conn->rollback();
Warto użyć tej funkcji, by odciążyć bazę możliwie jak najprędzej. }
O ile nie ma to wielkiego znaczenia przy małych serwisach interne- ?>
towych, o tyle już Srednie serwisy mogą odczuć nieznaczny wzrost
wydajnoSci bazy. By rozpocząć transakcję, należy wyłączyć (!) metodę auto-com-
mit(), ustawiając ją na wartoSć fałsz. Następnie możemy już wykonać
Transakcje interesujące nas zapytania w transakcji. By nieco ułatwić przykład, do
Kolejnym narzędziem, z którego warto skorzystać, jest możliwoSć do- każdego wyniku metody query() przypisano jedną zmienną. Jak wia-
konywania transakcji na bazie MySQL. Zasadę działania transakcji domo, metoda query() zwraca prawdę, gdy zapytanie typu INSERT się
tłumaczy się na przykładzie konta bankowego, bo to najprostszy, a za- powiedzie, a fałsz, gdy nastąpi jakiS błąd. Możemy dzięki temu spraw-
razem najbardziej obrazowy przykład. Załóżmy więc, że dokonujemy dzić czy wszystkie zapytania zostały zrealizowane poprawnie, poprzez
transakcji pieniędzy pomiędzy klientem a a klientem b . Gdy prze- wykonanie iloczynu logicznego wszystkich wyników. Jeżeli zostały
lewamy klientowi b jakaS sumę pieniędzy, klientowi a musimy ją wykonane poprawnie, finalizujemy transakcję. Zatwierdzenie transak-
odjąć. Punkt po punkcie wygląda to tak: cji następuje poprzez wykonanie metody commit(). Gdy któreS z zapy-
tań zwróci błąd, zostanie wykonana metoda rollback(), która cofnie
1 dodaj klientowi b kwotę x przelaną przez klienta a , wszystkie operacje dokonane począwszy od ustawienia metody auto-
2 odejmij klientowi a kwotę x przelaną do klienta b . -commit() na fałsz.
Prawidłowo skonstruowana transakcja napisana w paradygmacie
Do zrealizowania takiej operacji bankowej potrzebujemy więc obiektowym powinna być obsługiwana przez zaawansowane mechani-
dwóch zapytań. Co się stanie, gdy jedna z tych operacji się nie powie- zmy obsługi błędów dostępne wraz z PHP5. O nich szerzej mówiliSmy
dzie z jakichkolwiek przyczyn? Z pewnoScią ktoS na tym straci. Jak w pierwszej częSci artykułu (MI 9/2004).
więc to powinno wyglądać? Gdy baza dokona realizacji punktu 1,
a następnie punktu 2, przelew pieniędzy uznaje się za zakończony suk- Tworzenie własnych metod
cesem. Lecz gdy coS zawiedzie i jeden z punktów nie będzie mógł zo- Rozszerzanie funkcjonalnoSci interfejsu obiektowego mysqli jest jak
stać zrealizowany, baza danych cofnie całą operację. Taką metodę najbardziej możliwe i wcale nie trudne do stworzenia. Za rozszerzanie
działania nazywamy transakcją. Jest to więc niepodzielny zbiór pole- funkcjonalnoSci należy rozumieć możliwoSć utworzenia nowych funk-
ceń, które muszą zostać wykonane wszystkie naraz lub nie może zo- cji, które zrealizują te bardziej kompleksowe zadania, z których jednak
stać wykonane żadne z nich. korzystamy na tyle często, by warto je było tworzyć. Spójrzmy więc
Spróbujmy więc teraz zrealizować przykładową transakcję przy na poniższy przykład:
użyciu biblioteki mysqli. Przed tym jednak mała uwaga. Transakcji nie
uda się wykonać, gdy korzystamy z tabel typu ISAM lub MyISAM. Te typy nie obsługują transakcji. By wykonać transakcję, typ tabeli może- class my_mysqli extends mysqli
my zmienić np. na InnoDB, a zrobimy to następującym poleceniem: {
function array_id($id, $table) {
ALTER TABLE jakastabela TYPE = INNODB $query = sprintf( SELECT * FROM %s WHERE
id = %d , $table, $id);
Do utworzenia najprostszej transakcji wykorzystuje się trzy metody: return $this->query($query)->fetch_assoc();
autocommit(), która ustawiona na fałsz rozpoczyna transakcję; jest }
to więc ekwiwalent komendy BEGIN rozpocznij transakcję, }
104 INTERNET.listopad.2004
CMYK
WARSZTAT PROGRAMY MAGAZYN FIRMA Z OKŁADKI NEWSY NA CD
PHP
$conn = new mysqli( localhost , user , sługi wyjątków throw/try/catch. Druga częSć artykułu w przeważa-
password , test ); jącej częSci obejmowała zagadnienia związane z obsługą XML.
print_r($conn->array_id( 21 , jakastabela )); PHP5 zaimponował nową biblioteką do obsługi XML, Simple
?> XML, która jest rzeczywiScie prosta w obsłudze. PowiedzieliSmy
o XPath w SimpleXML oraz o obsłudze RSS przez SimpleXML.
W przykładzie rozszerzyliSmy klasę mysqli klasą my_mysqli. Następny fragment artykułu był opisem odSwieżonej biblioteki
Zawiera ona jedną metodę utworzoną na nasze potrzeby. Metoda ta DOM, wraz z jej możliwoSciami i problematyką. Tak dobrnęliSmy
array_id() posiada dwa parametry wejSciowe, które następnie trafiają do trzeciej częSci, która skupiła się na obsłudze baz danych przez
do zapytania. Odpowiedzią metody jest tablica asocjacyjna z wynika- PHP5. Został omówiony nowy, obiektowy interfejs MySQL o na-
mi. Ostatnia linia przykładu demonstruje w jaki sposób możemy póx- zwie mysqli oraz interfejs obiektowy SQLite. Trzecia częSć artyku-
niej skorzystać z utworzonej funkcji pomocniczej. łu była już ostatnią częScią kursu wprowadzającego w nowoSci
związane z piątą odsłoną PHP i stanowi praktyczny komplet pod-
Podsumowanie stawowych informacji na temat PHP5. n
W pierwszym artykule z serii został omówiony nowy silnik Zend
Engine 2.0. ZainstalowaliSmy nową wersję PHP5 na domowym ser-
werze, a następnie poznaliSmy specyfikatory dostępu, klasy i meto- PRZYDATNE ODNOŚNIKI
dy abstrakcyjne, interfejsy, słowo kluczowe final, konstruktory
http://php.net/mysqli oficjalna dokumentacja rozszerzenia MySQLi
i destruktory, stałe wewnątrzklasowe, właSciwoSci i metody sta-
Improved MySQL Ext.
tyczne, właSciwoSć instanceof, funkcję __autoload(), przeciążanie
http://php.net/sqlite oficjalna dokumentacja biblioteki plikowej bazy
metod, metody __get i __set, stałą __METHOD__ oraz zagadnienia
danych SQLite
związane z przestrzeniami nazw. W drugiej częSci artykułu dokoń- http://dev.mysql.com/doc/mysql/en/Installing.html oficjalna dokumen-
czyliSmy pojęcia związane z nowym silnikiem obiektowym. Było tacja wyjaśniająca jak zainstalować bazę MySQL
o klonowaniu obiektów oraz o zaawansowanym mechanizmie ob-
Nowe funkcje w PHP5
str_split() [2] => kst
Konwertuje ciąg znaków na tablicę numeryczną. Jako pierwszy parametr po- )
dajemy ciąg znaków, który chcemy przekształcić na tablicę numeryczną.
Drugi, opcjonalny parametr to liczba, która ustala co ile znaków ma nastąpić
strpbrk()
podzielenie ciągu znaków na elementy tablicy. Wartością domyślną parame-
Przeszukuje ciąg znaków, sprawdzając czy nie występuje w nim jeden ze
tru drugiego jest 1. Oznacza to, że ciąg znaków zostanie zamieniony na tyle
wskazanych jako parametr znaków. Jeżeli występuje, wyświetli ciąg znaków
elementów tablicy, ile znaków występuje w tym ciągu.
począwszy od odnalezionego znaku. Gdy nie znajdzie w ciągu znaków żad-
nego z poszukiwanych znaków, zwróci fałsz.
Sposób implementacji:
array str_split (string ciąg_znaków
Sposób implementacji:
[, int szerokoSć_cięcia])
string strpbrk (string stóg_siana, string lista_znaków)
Przykład:
Przykład:
$string = JakiS tekst ;
$string = JakiS tekst ;
$array1 = str_split($string);
echo strpbrk($string, );
print_r($array1);
echo strpbrk($string, ke );
$array2 = str_split($string, 4);
?>
print_r($array2);
?>
Wynik:
Wynik:
tekst
kiS tekst
Array
(
time_nanosleep()
[0] => J
[1] => a Opóznia wykonanie programu o podaną ilość sekund i nanosekund. Infor-
[2] => k
macje te podaje się kolejno jako pierwszy i drugi parametr. W przypadku po-
[3] => i
wodzenia funkcja zwraca prawdę, w przypadku błędu zwraca fałsz.
[4] => S
[5] =>
Sposób implementacji:
[6] => t
mixed time_nanosleep (int sekundy, int nanosekundy)
[7] => e
[8] => k
Przykład:
[9] => s
[10] => t
) Array time_nanosleep(0, 500000)
( ?>
[0] => Jaki
[1] => S te
Wynik: skrypt zasypia na pół sekundy.
INTERNET.listopad.2004 105
Wyszukiwarka
Podobne podstrony:
PHP Co nowego Co nowego w piątej wersji PHP 02 2004php howto 11PHP cz 1 v2co nowegoiso 9000 co nowegoCo zakwasza a co odkwasza organizm, cz 2wejsciowkaRSO27 11 2004Co nowegoCO NOWEGOBenedykt XVI 2011 10 17 list apostolski cz 11Czastki Modelu Standardowego co nowegoCo zakwasza a co odkwasza organizm, cz 1911 In Plane Site The truth of 9 11, 2004 (ENG)JAZDA W STYLU WESTERN W REKREACJI CZ 1129 Co nowego w znieczuleniu wziewnym 09 Smiechowicz Kwięcej podobnych podstron