====== Laboratorium, JiTW, Wstęp do PHP ======
PHP jest skryptowym językiem programowania, wykonywanym po stronie serwera. Zatem jako użytkownicy strony napisanej w PHP nie mamy dostępu do samego kodu PHP, lecz jedynie do tego, co zostaje wygenerowane przy interpretacji kodu PHP.
Skrypty PHP najczęściej uruchamiane są poprzez serwer Apache, który zazwyczaj skonfigurowany jest tak, aby pliki z rozszerzeniem ''.php'' kierować do przetwarzania przez PHP. Istnieje też możliwość uruchamiania skryptów PHP bezpośrednio z linii poleceń, przy pomocy tzw. PHP CLI (ang. //Command Line Interface//).
Na Laboratorium będą Państwo ćwiczyć PHP poprzez HTTP, a więc wykorzystywać go do generowania zawartości stron. Interpreter PHP dostępny jest zarówno na serwerze ''student'', jak i ''borg''. Szczegóły dotyczące uruchamiania skryptów PHP na tych serwerach podano w następnym ćwiczeniu.
===== Ćwiczenie: Pierwszy skrypt PHP =====
Proszę w katalogu dostępnym dla serwera HTTP przygotować w nim plik o rozszerzeniu php z następującą zawartością:
Lab PHP
Proszę nadać mu prawa do odczytu (na serwerze ''student'' - dodatkowo wykonywania: 755), a następnie obejrzeć stronę w przeglądarce:
http://student.agh.edu.pl/~login/nazwa.php
lub
http://borg.ia.agh.edu.pl/~login/nazwa.php
Proszę obejrzeć kod źródłowy strony (pod prawym klawiszem myszy //**Pokaż źródło**//).
^ TOP TIP ^
| Zauważ, w jaki sposób został wstawiony fragment kodu PHP do strony HTML. \\ Oprócz notacji '''' można także (przy włączonych odpowiednich ustawieniach serwera)\\ używać notacji krótszej '' ?>'', choć nie jest ona polecana.|
^ TOP TIP ^
| Dużo przydatnych informacji o konfiguracji serwera i PHP udostępnia funkcja ''phpinfo()''. \\ Aby z niej skorzystać, utwórz plik PHP zawierający tylko kod '''', \\ a zostanie wygenerowana strona HTML pełna informacji :-) |
===== Ćwiczenie: GET i POST =====
Poznali Państwo 2 metody przesyłania danych przy pomocy protokołu HTTP: GET i POST. Dane przesyłane tymi metodami dostępne są odpowiednio w tablicach:
* $_GET
* $_POST
Proszę przygotować stronę HTML z dwoma formularzami (z atrybutem ''action='wynik.php'''). Jeden powinien przesyłać dane metodą GET, a drugi metodą POST.
Proszę przygotować stronę PHP ''wynik.php'' następującej treści:
Aby dostać się do poszczególnych zmiennych w tablicach należy użyć składni: ''$_NAZWA['pole']''. Istnieje również tablica ''$_REQUEST'', zawierająca sumę zbiorów reprezentowanych przez ''$_GET'' oraz ''$_POST''.
**UWAGA:** powyższy kod PHP generuje stronę, która domyślnie interpretowana jest przez przeglądarkę jako strona XHTML. Oczywiście, nie zawiera ona niezbędnych elementów, więc jest zdecydowanie niezgodna ze standardem! Rozwiązaniem tego problemu byłoby dodanie przed i za blokiem '''' odpowiednich elementów (html, head, body...), lub poinformowanie przeglądarki, że jest to zwykły plik tekstowy. Można to uczynić wysyłając odpowiedni nagłówek HTTP przy pomocy funkcji [[http://www.php.net/manual/pl/function.header.php|header]]:
===== Funkcje w PHP =====
Podstawową jednostką organizacji kodu w PHP, podobnie jak w wielu innych językach programowania, jest [[http://www.php.net/manual/pl/language.functions.php|funkcja]]. W przeciwieństwie np. do języka C, definicja funkcji nie musi określać typu zwracanego - specyfikuje tylko listę paramterów.
function witaj($imie) {
return 'Cześć ' . $imie . '!';
}
Możliwe jest tworzenie funkcji ze zmienną liczbą argumentów, poprzez określenie dla niektórych z nich wartości domyślnych:
function witaj($imie = 'Jasiu') {
return 'Cześć ' . $imie . '!';
}
Proszę przetestować działanie funkcji przy różnych liczbach i typach argumentów.
===== Operacje na plikach =====
Operacje na plikach w PHP wykonywane są w sposób podobny np. do języka C, ale z pewnymi udogodnieniami. Możemy np. w prosty sposób stworzyć skrypt wyświetlający zawartość pliku tekstowego o podanej nazwie, znajdującego się w tym samym katalogu co sam skrypt.
Aby teraz otworzyć odpowiednią stronę (wczytującą dany plik) wystarczy uruchomić stronę w przeglądarce podając zmienną ''id'':
strona.php?id=1
LOL Proszę wczytać stronę z inną wartością ''id''. Jak zabezpieczyć stronę przed takim działaniem? Spróbuj poprawić stronę, tak aby nie pojawiał się komunikat o błędzie. \\
**Podpowiedź**: warto dodać sprawdzanie tego, co użytkownik przesyła w zmiennej ''id'', a przed wczytywaniem zawartości pliku sprawdzać, czy plik w ogóle istnieje.
LOL Proszę podać funkcji plik zawierający wiele linijek tekstu. Dlaczego jest on wyświetlany poprawnie? Co stanie się, jeżeli zmienimy typ MIME wysyłany na początku skryptu np. na ''text/html''? A co będzie, jeżeli w ogóle wyłączymy tę linijkę? Dlaczego?
**Uwaga** :!: Powyższy skrypt służy jedynie celom demonstracyjnym i nie jest odpowiednio zabezpieczony przed wczytywaniem niepożądanych danych na stronę. \\ PHP udostępnia funkcje umożliwiające lepsze zabezpieczanie wyświetlanych danych tj. [[http://www.php.net/manual/en/function.htmlspecialchars.php|htmlspecialchars]], [[http://www.php.net/manual/en/function.htmlentities.php|htmlentities]], [[http://php.net/manual/en/function.strip-tags.php|strip_tags]] itp.
^ TOP TIP ^
| Zauważ, że funkcja ''open()'' nie tylko otwiera pliki w lokalnym systemie plików np.: $handle1 = fopen("http://www.przyklad.com/", "r");
$handle2 = fopen("ftp://uzytkownik:haslo@przyklad.com/jakisplik.txt", "w");
|
===== Pliki ze strukturą =====
Powyższy przykład oparty jest o pliki tekstowe, nie zawierające żadnej struktury - no, może z wyjątkiem znaków nowych linii. W praktyce wygodnie jest przechowywać dane w plikach w sposób uporządkowany (coś w rodzaju najprostszej, [[http://pl.wikipedia.org/wiki/Kartotekowa_baza_danych|kartotekowej bazy danych]]). Wygodny do tego jest format CSV (comma-separated values):
Nazwisko;Imię;Miasto;E-mail
Kowalski;Jan;Warszawa;kowalski@warszawa.pl
Wiszniewska;Anna;Kraków;wiszniewska@krakow.pl
Zieliński;Henryk;Wrocław;zielinski@wroclaw.pl
Do obsługi plików CSV służą w PHP funkcje [[http://www.php.net/manual/pl/function.fgetcsv.php|fgetcsv]] oraz [[http://www.php.net/manual/pl/function.fputcsv.php|fputcsv]]. Funkcja ''fgetcsv'' domyślnie zakłada, że pola w każdym rekordzie oddzielone są przecinkiem ('','') i ograniczone cudzysłowami (''"''). Aby poprawnie przetworzyć powyższy przykład, należy zmienić parametry określające te znaki zgodnie z definicją funkcji.
Dane wczytane przy pomocy ''fgetcsv'' umieszczane są w tablicy wyliczeniowej - takiej, jaką znamy np. z C (indeksowana 0, 1, 2, ...). PHP udostępnia również tablice asocjacyjne, w który poszczególne elementy indeksowane są etykietami, np.:
$zoo['pelikan'] = 'Ptak z dużym dziobem';
$zoo['jenot'] = 'Szop po tuningu';
Podobnie, ''fputcsv'' umożliwia [[http://pl.wikipedia.org/wiki/Serializacja|serializację]] tablicy to pliku CSV.
Bardziej złożone struktury można oczywiście przechowywać np. w formatach:
* XML - który poznamy w dalszej części kursu,
* JSON - podzbiór notacji JavaScript (to też będzie w dalszej części), bardzo wygodny przy AJAX.
* [[http://en.wikipedia.org/wiki/YAML|YAML]] - format umożliwiający definiowanie skomplikowanych struktur danych, a jednocześnie bardzo czytelny dla człowieka; dla PHP istnieje parser/generator [[http://code.google.com/p/spyc/|spyc]].
Z kolei mniej skomplikowane struktury danych można przetwarzać np. linia po linii (z użyciem ''fgets()'') oraz:
* [[http://www.php.net/manual/pl/function.explode.php|explode]]
* [[http://www.php.net/manual/pl/function.implode.php|implode]]
===== Ćwiczenie: Słownik krzyżówkowy =====
Proszę napisać program wyszukujący w słowniku hasła do krzyżówek.
Na stronie internetowej użytkownik wpisuje w formularzu wyraz, zastępując każdą brakującą literę znakiem podkreślenia dolnego ('_').
Jako wynik dostaje listę wyrazów, które pasują do podanego wzorca.
**Przykład**:
* **Plik słownika**: \\ ala \\ kot \\ basia \\ lala \\ ela \\ ola \\ kasia \\
* **Wejście**: \\ _la
* **Wyjscie**: \\ ala \\ ela \\ ola
Uwaga na UTF8!
$str='lód';
echo strlen($str); // zwróci 4
echo mb_strlen($str); // zwróci 3
echo $str[1]; // nie zwróci "ó" :(
$str_array=preg_split('//u', $str, null, PREG_SPLIT_NO_EMPTY); // konwersja do tablicy zgodna z UTF8
echo $str_array[1]; // zwróci "ó"
Uwaga: ''gets()'' odczytuje linie z pliku wraz z znakiem końca linii; przydatna funkcja: ''trim()'' - usuwa białe znaki (włączając w to znak końca linii) na końcu i na początku łańcucha znaków.
**Uwaga:** słownik może zajmować dużo miejsca, niebezpieczeństwo przekroczenia limitów przestrzeni dyskowej (''quota'').
===== Dodatkowe informacje =====
* [[http://php.net/manual/pl/index.php|Manual PHP]]
* [[http://pl.wikibooks.org/wiki/PHP|Wikibook o PHP]]