Kurs
PHP - część 3
Lekcja 3
Obsługa formularzy
Skryptu PHP można użyć do obsługi formularza. Aby tego dokonać,
należy najpierw odpowiednio przygotować formularz. W znaczniku FORM w
parametrze ACTION należy podać adres dokumentu PHP mającego obsłużyć ten
formularz. Parametr METHOD może mieć wartość POST lub GET - obie metody są
obsługiwane przez PHP. Jednak należy pamiętać, że formularze wysyłane
przez GET mają dość ograniczoną długość. Ich zaletą jest za to, że użytkownik
może zrobić sobie zakładkę do wyników formularza, co nie jest możliwe w
przypadku formularzy POST. Należy pamiętać o zdefiniowaniu nazw wszystkich
pól formularza z których skrypt ma skorzystać.
Przykład:
<FORM ACTION=skrypt.php3 METHOD=POST>
<INPUT TYPE=TEXT NAME=tekst>
</FORM>
Napisanie skryptu obsługującego formularz jest bardzo proste. Właściwie
większość pracy wykonuje za nas PHP - po prostu w skrypcie od razu będą
dostępne zmienne o nazwach takich jak nazwy pól formularza, zawierające ich
wartości:
echo($tekst); /* ta linia wyświetli zawartość
pola tekst z formularza */
W przypadku pola tekstowego będzie to po prostu wpisany przez
użytkownika tekst. Jeżeli pole jest typu CHECKBOX wartością będzie
"on" jeżeli pole jest zaznaczone, lub zmienna będzie pusta jeżeli
pole nie zostało zaznaczone. Jeżeli w polu typu CHECKBOX podamy parametr
VALUE, będzie on użyty zamiast "on". Tak samo wygląda obsługa
pola typu RADIO. Wartością pola SELECT będzie wartość parametru VALUE
zdefiniowanego w znaczniku OPTION.
Wysyłanie poczty
Ze skryptu PHP można bardzo łatwo wysłać e-maila. Służy do tego funkcja
mail. Pobiera ona 4 parametry. Pierwszy z nich to lista adresatów
oddzielonych spacjami. Następny to temat wiadomości. Trzeci parametr to treść
wiadomości, a czwarty może zawierać dodatkowe pola nagłówka wiadomości
(jest dopisywany na końcu nagłówka). Przykład:
mail("ty@twoj.serwer", "Wiadmość testowa",
"Tutaj można wpisać treść wiadomości.\nNastępna linia.");
Ten przykład wyśle wiadomość na adres ty@twoj.serwer.
Wysyłanie formularza pocztą.
Mając powyższe wiadomości wysłanie formularza pocztą nie powinno stanowić
problemu. Najpierw trzeba zdefiniować formularz:
<FORM ACTION=skrypt.php3 METHOD=POST>
<INPUT TYPE=TEXT NAME=email><BR>
<TEXTAREA NAME=tresc></TEXTAREA><BR>
<INPUT TYPE=SUBMIT>
</FORM>
Teraz skrypt który wyśle dane pocztą:
mail("ty@twoj.serwer", "Formularz", $tresc, "Reply-To:
$email");
Jedna linijka i gotowe.s
Widać tutaj jedno z ważniejszych zastosowań 4 parametru funkcji mail: można
podać adres zwrotny listu. Jeżeli teraz użytkownik wpisze do formularza swój
e-mail, będzie można odpowiedzieć używając funkcji reply programu
pocztowego. Uwaga: nie każdy serwer pozwoli na wysłanie wiadomości z polem
Reply-To zawierającej adres na innym serwerze.
Lekcja 4
Uprawnienia
Aby skrypt PHP mógł odwołać się do pliku, musi mieć
odpowiednie uprawnienia. Szczegóły są zależne od serwera. Najczęściej
chyba skrypt ma uprawnienia takie, jak użytkownik który go umieścił. Może
też mieć uprawnienia użytkownika nobody - wtedy żeby móc ze skryptu
zmodyfikować jakiś plik, trzeba nadać prawo zapisu wszystkim użytkownikom.
Dokładne inforacje na ten temat powinien dostarczyć administrator serwera na
którym umieszczamy skrypty.
Otwieranie plików
Przed wykonaniem jakiejkolwiek operacji na pliku, należy go
otworzyć. Służy do tego funkcja fopen. Pobiera ona 2 argumenty - pierwszy
to nazwa pliku który chcemy otworzyć. Drugi parametr może mieć następujące
wartości:
r - otwiera plik do odczytu
r+ - otwiera plik do odczytu i zapisu
w - kasuje zawartość pliku i otwiera go do zapisu
w+ - kasuje zawartość pliku i otwiera go do zapisu i odczytu
a - otwiera plik do dopisywania
a+ - otwiera plik do dopisywania i odczytu
Co ciekawe, funkcja fopen może otworzyć plik na innym serwerze przez
protokół http (tylko odczyt), lub ftp (odczyt lub zapis, ale nie jednocześnie).
fopen zwraca liczbę, która służy do identyfikowania otwartego pliku. Przykład:
$file=fopen("file.txt", "r"); /* otwiera plik file.txt
do odczytu */
$file=fopen("file.txt", "w"); /* otwiera plik do zapisu.
Jeżeli plik
nie istnieje, zostanie utworzony */
$file=fopen("ftp://adres.serwera/plik", "r"); /* otwiera
plik przez
protokół ftp */
Po zakończeniu operacji na pliku, należy go zamknąć funkcją fclose, np:
$file=fopen("file.txt", "r");
fclose($file);
Odczyt z pliku
Jest kilka funkcji służących do odczytu z pliku. Zacznę może od funkcji
fgetc - odczytuje ona 1 znak z pliku:
$znak=getc($file);
Jeśli funkcja napotka koniec pliku, zwróci wartość FALSE. Po odczytaniu
znaku, pozycja w pliku jest przesuwana o 1 do przodu. Dzięki temu, po
kolejnym wywołaniu funkcji getc otrzymamy kolejny znak, a nie jeszcze raz ten
sam.
Kolejną funkcją jest funkcja fgets:
$linia=fgets($file, $maxLen);
Drugi parametr określa ile znaków funkcja może odczytać. Trzecią
funkcją do odczytu z pliku jest fread. Działa ona podobnie do fgets, z tym
że nie przerywa czytania gdy natrafi na znak nowej linii.
Zapis do pliku
Do zapisywania w pliku służy funkcja fwrite:
fwrite($file, $tekst, $maxLen);
Funkcja ta zapisuje tekst podany jako 2 parametr do pliku identyfikowanego
przez $file. 3 parametr jest opcjonalny i określa maksymalną długość
tekstu, jaka może zostać zapisana. Jest jeszcze funkcja fputs, ale działa
ona dokładnie tak samo. W PHP często występują identyczne funkcje pod
innymi nazwami - ułatwia to życie osobom przyzwyczajonym do innych języków.
Blokowanie plików
Jak dotąd wszystko wydaje się proste. Co jednak stanie się, jeżeli
jednocześnie zostaną uruchomione dwie kopie skryptu, i obie będą próbowały
zmienić ten sam plik? Sytuacja taka jak łatwo się domyślić, może miec
przykre konsekwencje. Aby rozwiązać ten problem należy użyć blokowania
plików. Służy do tego funkcja flock:
flock($file, mode);
Pierwszy argument funkcji flock to identyfikator otwartego pliku. Argument
mode określa typ dostępu, jaki chcemy uzyskać. Może mieć następujące
wartości:
1 - dostęp do odczytu
2 - dostęp do zapisu
3 - zwolnienie blokady
Jeżeli chcemy uzyskać dostęp do zapisu, najpierw wszystkie
inne blokady muszą być zwolnione. Do uzyskania dostępu do odczytu
wystarczy, ze plik nie będzie zablokowany do zapisu - w ten sposób wiele
skryptów może jednocześnie czytać z pliku, ale tylko jeden może do niego
zapisywać. Dodatkowo w trakcie zapisu żaden inny skrypt nie może odczytywać
z pliku - dzięki temu nie natrafi na niekompletne dane.
Jeżeli określony rodzaj dostępu nie może być w danej
chwili uzyskany, wykonanie skryptu zostanie wstrzymane do czasu, gdy będzie
to możliwe. Plik powinien być blokowany na jak najkrótszy czas, aby nie
wstrzymywać niepotrzebnie innych operacji. Jeżeli chcemy tylko sprawdzić,
czy plik jest zablokowany, do argumentu mode należy dodać 4 - wtedy funkcja
zwróci wartość TRUE jeżeli plik nie jest zablokowany, lub FALSE gdy jest.
Przykład:
$file1=fopen("jakis.plik", "r"); /* otwiera 2 razy ten
sam plik */
$file2=fopen("jakis.plik", "r");
flock($file1, 2); /* blokuje pierwszą kopie */
if(flock($file2, 6)) /* funkcja flock zwróci false, ponieważ plik */
{ /* jest już zablokowany */
echo("Plik nie zablokowany");
}else{
echo("Plik zablokowany");
}
flock($file, 3); /* odblokowuje plik */
Inne funkcje
PHP zawiera wiele funkcji służących do obsługi plików. Oto niektóre z
nich:
file_exists(nazwa) - sprawdza, czy istnieje plik o podanej nazwie
filegroup(nazwa) - zwraca identyfikator grupy, do której należy plik
fileowner(nazwa) - zwraca identyfikator właściciela pliku
filesize(nazwa) - zwraca rozmiar pliku o podanej nazwie
ftell($file) - zwraca pozycję w otwartym pliku
is_readable(nazwa) - sprawdza, czy skrypt ma uprawnienia do odczytania
pliku
is_writeable(nazwa) - sprawdza, czy skrypt może zapisać do pliku
mkdir(nazwa) - tworzy katalog o podanej nazwie
readfile(nazwa) - wyświetla zawartość pliku
Prosty licznik tekstowy
Licznik tekstowy posłuży jako praktyczny przykład wykorzystania dostępu do
plików:
if(file_exists("counter.n")) /* sprawdza, czy plik istnieje */
{
$file=fopen("counter.n", "r"); /* otwiera plik */
flock($file, 1); /* blokuje plik */
$ile=fgets($file, 100); /* odczytuje wartość */
flock($file, 3); /* odblokowuje plik */
fclose($file); /* zamyka plik */
$ile++; /* zwiększa wartość o 1 */
}
else
$ile=1; /* jeśli plik nie istnieje, wyświetli się 1 */
$file=fopen("counter.n", "w"); /* otwiera plik do
zapisu */
flock($file, 2); /* blokuje do zapisu */
fwrite($file, $ile); /* zapisuje wartość */
flock($file, 3); /* odblokowuje plik */
fclose($file); /* zamyka plik */
echo($ile); /* wyświetla wartość */
Ten skrypt odczytuje z pliku wartość, zwiększa ją o 1, a następnie wyświetla
na stronie. Jeżeli plik counter.n nie istnieje, skrypt spróbuje go utworzyć.
Ten licznik zwiększy się za każdym razem gry użytkownik wejdzie na stronę,
lub ją odświeży. Licznik odporny na odświeżanie pokaże w części 5.
Grzegorz 'Ygreg' Plebanski
ygreg@and.pl
http://ygreg.and.pl
|