kurs php - podstawy - Pokrycia dachowe Śląsk
Transkrypt
kurs php - podstawy - Pokrycia dachowe Śląsk
KURS PHP - PODSTAWY Copyright © 2011 INSIGO Grzegorz Róg. Wszelkie prawa zastrzeżone. INSIGO Grzegorz Róg www.eduweb.pl ISBN: 978-83-62083-23-7 Kurs składa się z dwóch elementów: książki oraz płyty. Dołączona płyta stanowi część składową książki i nie może być przedmiotem odrębnej transakcji. PHP - PODSTAWY 3 AUTOR MATEUSZ MANAJ Mateusz Manaj od 8 lat zajmuje się programowaniem dynamicznych stron WWW. Jako kierownik działu oprogramowania i nowych technologii w firmie Softgraf – Mikołów jest autorem wielu systemów zarządzania treścią, algorytmów – phpclasses. org, portali, dedykowanych systemów zarządzania jednostkami wewnątrz-firmowymi, m.in. autorskiego systemu dla Eurovia POLSKA S.A. Można powiedzieć - poliglota - biegle posługuje się ogromną ilością języków programowania sieciowego i środowiskowego. W wolnych chwilach Mateusz udoskonalaja swoje umiejętności wzbogacając je o nowe technologie i rozwiązania m.in. po to, abyś już dzisiaj mógł korzystać z tej wiedzy bez przeszkód! www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 4 WPROWADZENIE Język PHP jest to najpopularniejszy obiektowy język programowania wykorzystywany podczas tworzenia stron WWW. Pozwala on na generowanie danych w czasie rzeczywistym i zalicza się do języków server-side, które działają po stronie serwera, w przeciwieństwie do języków clientside, takich jak JavaScript czy ActionScript, działających po stronie przeglądarki. Najprostszym sposobem na zilustrowanie tej różnicy, będzie skrypt, który pobiera czas i wyświetla go na stronie WWW. W przypadku PHP będzie to czas serwera, w przypadku języków client-side, na przykład JS, będzie to czas systemowy użytkownika. PHP pozwala także na komunikację z bazą danych. CIEKAWE INFORMACJE O PHP Late Static Bindings Od PHP w wersji 5.3.0, interpreter zawiera nową funkcjonalność nazwaną Late Static Bindings która może być użyta jako referencja statycznych obiektów danej klasy. Będąc bardziej precyzyjnym, LSB pracuje przez zapis klasy „non-forwarding call”. Stosowanie nowego operatora LSB sprowadza się do umieszczenia słowa kluczowego static zamiast zwykłego odniesienia do wartości statycznych poprzez self, jak to było do czasu wprowadzenia funkcjonalności LSB. Mamy zatem 3. główne operatory dostępu self::, parent:: oraz static::. Zamiennikiem do obiektowego typu static:: jest strukturalna funkcja forward_static_call(). Stosowanie funkcji get_called_class() również jest dostępne w przypadku stosowania LSB w naszej klasie. Nowa funkcjonalność przyjęła swoją nazwę z dwu powodów „late binding” wzięło się z faktu iż static:: nie jest obsługiwany przez klasę w której dana metoda statyczna jest umieszczona, lecz obliczana na podstawie równolegle przetwarzanych informacji. Jest również druga część o nazwie „static binding”, jak łatwo się domyślić chodzi o skojarzenie LSB z obiektami statycznymi. www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 5 Ograniczenia self:: Statyczne referencje do klasy, takie jak self:: lub __CLASS__ (ekstrahuje nazwę klasy) były rozpatrywane przez tę samą klasę do której się odnosiły, co ilustruje poniższy przykład: Użycie self:: <?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?> Powyższy przykład wyświetli: A LSB – zastosowanie LSB próbuje rozwiązać powyższe ogranicznenie poprzez słowo kluczowe static:: które odnosi się do klasy wywołującej je w czasie rzeczywistym (runtime). Niejako słowo static:: daje możliwość odniesienia się do klasy B z metody test(), w ten sposób nie powstało nowe słowo kluczowe w PHP lecz użyte zostało wcześniej zarezerwowane – static:: Prosty przykład użycia static:: www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 6 <?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // Zaczynamy pisanie LSB } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?> Powyższy przykład wyświetli: B Uwaga: W przypadku niestatycznym wywoływana klasa będzie instancją tego obiektu. Od czasu używania $this-> użycie LSB dla metod prywatnych może dawać inne rezultaty. Dodatkową różnicą jest użycie LSB, gdzie static:: może odnosić się tylko do właściwości statycznych. Przykład użycia static:: na niestatycznym obiekcie <?php class A { private function foo() { echo “Sukces!\n”; } public function test() { $this->foo(); static::foo(); } } class B extends A { /* foo() zostanie skopiowane do klasy B, stąd jego zasięg będzie w wywołanie się powiedzie. */ www.eduweb.pl * klasie A oraz Mateusz Manaj PHP - PODSTAWY 7 } class C extends A { private function foo() { /* Pierwotna metoda została nadpisana, zasięg nowej jest w C } } $b = new B(); $b->test(); $c = new C(); $c->test(); // NIEPOWIEDZIE SIĘ! ?> Powyższy przykład wyświetli: Sukces! Sukces! Sukces! Fatal error: Call to private method C::foo() from context ‘A’ in /tmp/test.php on line 9 Przykład 4. Przekazywanie i nie przekazywanie wywołań <?php class A { public static function foo() { static::who(); } } public static function who() { echo __CLASS__.”\n”; } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 8 public static function who() { echo __CLASS__.”\n”; } } class C extends B { public static function who() { echo __CLASS__.”\n”; } } C::test(); ?> Powyższy przykład wyświetli: A C C Tekst przetłumaczony i przeredagowany na podstawie artykułu dostępnego na stronie: http:// www.php.net/lsb SESJE Czy zastanawiałeś się w jaki sposób ludzie przechwytują sesje użytkowników, następnie przechwycone dane wykorzystują do np. zalogowania się? Dzieje się to poprzez specjalne sniffery sieciowe które mogą podsłuchiwać użytkowników w trakcie korzystania z Internetu a w odpowiedzi dostają nieprzetworzone nagłówki np. GET lub POST. Z takich strzępków informacji możemy wyciągnąć potrzebne dane a następnie odnieść się do zasobów serwera i otrzymać w odpowiedzi konkretne dane wyjściowe. Jakiś czas temu próbowałem zrobić coś takiego i muszę przyznać, że jest to metoda bardzo szybka i efektywna (na nasze nieszczęście). Oczywiście próbowałem tego na swoim prywatnym serwerze. Pytanie brzmi jak się przed tym obronić ? Odpowiedź jest prosta, zastosować mechanizm szyfrowania. Niekoniecznie polecam MD5 ze względu na to, że jest to szyfrowanie w jedną stronę oraz dostępne są strony www na których można sprawdzić odszyfrowanie takiego ciągu metodą brute-force. Zatem najlepiej zastosować własną kłódkę i dorobić własny klucz, czyli: www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 9 <?php class Cipher { protected static $key = “NAk9WhaMbFdgHlkJg83q1Z=”; public static function Encode($STRING) { $encrypted_data = mcrypt_ecb (MCRYPT_3DES, self::$key, $STRING, MCRYPT_ENCRYPT); return base64_encode($encrypted_data); } public static function Decode($HASH) { $dec = mcrypt_ecb (MCRYPT_3DES, self::$key, base64_decode($HASH), MCRYPT_DECRYPT); return trim($dec); } } $str = “Moje#Tajne@dane*&do___zaszyfrowania”; $enc = Cipher::Encode($str); $dec = Cipher::Decode($enc); echo “Zaszyfrowane dane: “.$enc.”<br />”; echo “Po odszyfrowaniu: “.$dec; ?> Oczywiście możemy zastosować dowolnie inny klucz, który nie musi być wpisany na sztywno jako zmienna członkowska statyczna typu chronionego, ale przy rozszyfrowywaniu (metoda Decode()) lub szyfrowaniu możemy przekazywać ten klucz przy wywołaniu danej metody. Wszystko zależy od tego jak Ty to widzisz. Powyższy przykład wyświetli: Zaszyfrowane dane: 1fJ92qL7GUD2VDrueBRfAvLf74Kni4fFrwm+WmrmSB7iE06tEWxsCg== Po odszyfrowaniu: Moje#Tajne@dane*&do___zaszyfrowania www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 10 Tak zaszyfrowane dane możemy bez obaw zapisać do sesji. Użytkownik który podsłuchuje to co robimy zobaczy w superglobalnej zmiennej sesyjnej ciąg: 1fJ92qL7GUD2VDrueBRfAvLf74Kni4f Frwm+WmrmSB7iE06tEWxsCg== który zapewne nic mu nie powie dopóki dopóty nie znajdzie odpowiedniego klucza. Oczywiście możesz powiedzieć, że nie ma takiego zabezpieczenia którego nie da się złamać. Owszem, tak jest. Różnica polega na tym, że możemy to znacznie utrudnić potencjalnemu napastnikowi. Abstrahując od zabezpieczeń naszych danych w sesji, dobrą praktyką przy kasowaniu jej jest najpierw przypisanie jej pustego string’a a następnie wykonanie funkcji session_destroy() aby mieć 100% pewność, że gdy z jakiś niewyjaśnionych przyczyn funkcja session_destroy() nie zadziała jak należy to wartość zmiennej sesyjnej jest pusta i nie zawiera żadnych nie potrzebnych lub wrażliwych danych. Poniżej przedstawiam przykład: <?php /* Jeśli zainicjalizowaliśmy sesję i wprowadziliśmy do niej wartości np. * z logowania, możemy ją teraz bezpiecznie usunąć. */ $_SESSION[‘login’] = “”; session_destroy(); ?> To samo tyczy się używania superglobalnej tablicy $_COOKIE czyli ciasteczek, ale przed jego usunięciem musimy je przeterminować ustawiając czas przydatności (czas życia w pamięci przeglądarki) na ujemny np. na 2000 rok. KONFIGURACJA SERWERA Jeśli jesteś administratorem fizycznego serwera www lub chciałbyś wiedzieć co ja osobiście robię u siebie na serwerach, aby były one bezpieczne i dobrze skonfigurowane, przedstawiam kilka dobrych wskazówek. Ustawienia zastosowuję w pliku konfiguracyjnym php.ini www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 11 • • • • • • • • • • • • asp_tags – ustawienie na wartość ON powoduje możliwość użycia tagów języka ASP <% %> w kodzie PHP. safe_mode – Od PHP w wersji 5.3.0 ta własność jest przestarzała i nie należy jej używać ze względów bezpieczeństwa. W przypadku gdy korzystasz z PHP w wersji < 5.3.0 pozostaw tą opcję włączoną gdy masz uruchomione wirtualne serwery (virtual hosts) max_execution_time – własność ta mówi interpreterowi jak długo ma przetwarzać dany skrypt (czas przetwarzania skryptu wyrażony w ms). Po tym czasie w przeglądarce pokazuje się na błąd z rodziny timeout. max_input_time – jeśli na Twój serwer przesyłane zostają duże pliki możesz pozostawić domyślną wartość -1 co oznacza brak limitu czasu przesyłanego żądania, lub ustaw ją na najbardziej dla Ciebie odpowiednią pamiętając o wyrażeniu tego czasu w milisekundach. memory_limit – własność ta mówi ile pamięci może maksymalnie zająć skrypt PHP. Domyślną wartością jest 8 MB (“8M”). Jeśli przetwarzasz duże pliki np. parsujesz ogromny plik XML lub XLS (excel) ustaw tą wartość na kilkukrotnie większą. error_reporting – Raportowanie błędów. Jeśli wystąpi błąd w naszym skrypcie PHP to ta wartość mówi czy ma go wyświetlić. Domyślną wartością jest E_ALL, ale ja osobiście, niemal zawsze korzystam z trybu E_ALL | E_STRICT. display_errors – jeśli error_reporting jest włączony i ma jakąkolwiek wartość różną od OFF wtedy ta opcja blokuje (OFF) lub odblokowuje (ON) wyświetlenie błędu w przeglądarce. Jeśli error_reporting = OFF oraz display_errors = ON/OFF wtedy nawet gdybyśmy bardzo chcieli przechwycić taki błąd np. metodą try…catch to tego nie zrobimy ponieważ wszystkie błędy są pomijane i kod leci dalej, co skutkuje tym, że tych błędów nie ma ale nasz kod nie chce poprawnie działać. Osobiście tą opcję mam ustwioną na OFF ponieważ zwykle sam ręcznie przechwytuję wszystkie błędy i odpowiednio je przetwarzam. log_errors – mówi nam czy PHP automatycznie zapisuje błędy do pliku dziennika. W przypadku serwerów produkcyjnych włączamy tę opcję (ON), by dysponować jednolitym źródłem wszystkich komunikatów błędów. register_globals i register_long_arrays - wartości te decydują o tym, czy można stosować starszy styl odwołań do zmiennych globalnych HTTP, takich jak GET czy POST. Od PHP w wersji 5.x posługujemy się wyłącznie nowszym systemem, więc pozostawimy tę opcję wyłączoną (OFF). magic_quotes_gpc - wskazuje, czy PHP automatycznie wstawia znaki ucieczki przez apostrofami w przekazywanych danych (w danych POST, 6ET i COOKIE). W tym kursie polecam samodzielne wstawianie znaków ucieczki w otrzymywanych danych, więc pozostawimy tę opcję wyłączoną (OFF). mbstring.language – zwykle tę opcję ustawiam na Neutral, aby mbstring nie preferował żadnego konkretnego języka. mbstring.internal encoding – w przypadku serwerów deweloperskich jak i produkcyjnych ustawiam tę opcję na UTF-8, tak aby PHP wewnętrznie operował ciągami Unicode. www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 12 PRZYDATNE POLECENIA BAZODANOWE: Zaznaczenie danych w tabeli SELECT nazwa_kolumn(y) FROM nazwa_tabeli SELECT imie, nazwisko FROM users Zaznaczenie danych bez powtórzeń SELECT DISTINCT nazwa_kolumny FROM nazwa_tabeli SELECT DISTINCT imie, nazwisko FROM users Wprowadzenie danych do tabeli * INSERT INTO nazwa_tabeli (nazwa(y)_kolumn(y)) VALUES (wartość(ci)) INSERT INTO users (nick, haslo) VALUES (‘super-nick’, ‘password’) Aktualizacja danych tabeli UPDATE nazwa_tabeli SET nazwa_kolumny1=wartość1 UPDATE users SET nick=inny-nick, haslo=super-haslo Usunięcie danych z tabeli DELETE FROM nazwa_tabeli DELETE FROM users * W zapytaniu do bazy danych przy odniesieniu do większej ilości kolumn stosuje się ich nazwy wyszczególnione po przecinku; to samo odnosi się do wartości VALUES Sprecyzowanie zasięgu operacji: Dla każdej operacji podstawowej możemy określić operandy precyzujące zasięg takiego zapytania. Dla przykładu: „Zaznacz proszę kolumnę nick, haslo z tabeli users gdzie imię jest równe ‚Zenobiusz’ a wyniki wyświetl w postaci posortowanej od Z-A www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 13 Nazwa SQL Przykład Klauzula WHERE * SELECT nazwa_kolumn(y) FROM nazwa_tabeli WHERE nazwa_kolumny [oper.] wartość SELECT nick, haslo FROM users WHERE imie = ‘Zenobiusz’ Operator logiczny AND..OR SELECT nazwa_kolumn(y) FROM nazwa_tabeli WHERE nazwa_kolumny [oper.] wartość AND nazwa_kolumny [oper.] wartość SELECT nick, haslo FROM users WHERE imie = ‘Zenobiusz’ AND nazwisko = ‘Kowalski’ ORDER BY ASC..DESC SELECT nazwa_kolumn(y) FROM nazwa_tabeli WHERE nazwa_kolumny [oper.] wartość ORDER BY nazwa_ kolumny DESC SELECT nick, haslo FROM users WHERE imie = ‘Zenobiusz’ ORDER BY imie DESC Operator SQL Sprawdzenie równości <> Sprawdzenie nierówności (również !=) > Większe od… < Mniejsze od… >= Większe bądź równe od… <= Mniejsze bądź równe… BETWEEN LIKE www.eduweb.pl Opis = Czy dwie wartości znajdują się w przedziale pomiędzy… Znajdowanie wzoru (pattern) Mateusz Manaj PHP - PODSTAWY 14 MATERIAŁY ŹRÓDŁOWE: Skąd czerpać tajemną wiedzę i inspirację? Poniżej przedstawiam dodatkowe źródła informacji o pisaniu aplikacji WWW: • • • • • • • Dokumentacja PHP (http://www.php.net/manual/pl). Podstawowe źródło informacji o PHP i jego funkcjach pełne komentarzy użytkowników i wskazówek pozwalających na uniknięcie często występujących problemów. PHP Freaks (http://www.phpfreaks.com). Społeczność użytkowników i entuzjastów PHP oraz związanych z nim technologii. Na stronie można znaleźć poradniki, informacje i inne pomocne wskazówki. Repozytorium klas PHP (http://www.phpclasses.org). Jest to największy zbiór klas pisany przez wielu znanych programistów. W3 Schools (http://www.w3schools.com). Bardzo użyteczna strona internetowa przedstawiająca różne technologie pisania udanych aplikacji WWW. Znajdują się w niej również dobre mini-kursy (tutoriale) z których również możesz się czegoś nowego dowiedzieć. The World Wide Web Consortium (http://www.w3.org). Co tu dużo mówić… jeśli masz podstawowe pytania dotyczące czemu dokument xHTML musi rozpoczynać się o tagu <!DOCTYPE… > to tam się wszystkiego dowiesz. Naprawdę dobra lektura na długie zimowe wieczory dla wytrwałych. Dokumentacja internetowa MySQL (http://dev.mysql.com/doc). Jest to pełna internetowa dokumentacja MySQL. Została bardzo dobrze napisana i zawiera wszystko, co potrzebne, by w pełni i skutecznie korzystać z serwera bazy danych MySQL. Dokumentacja internetowa PostgreSQL (http://www.postgresqI.org/docs). Niezwykle bogata i dobrze napisana. www.eduweb.pl Mateusz Manaj PHP - PODSTAWY 15 KORZYSTANIE Z PŁYTY DVD DOŁĄCZONEJ DO KSIĄŻKI Na płycie DVD znajdziesz pełne szkolenie z zakresu Adobe Dreamweaver które jest dodatkiem do książki. Prosimy o pobranie licencji, która jednocześnie jest dowodem zakupu oraz lagalności kursu. Certyfikat jest dostępny na stronie http://www.eduweb.pl po zalogowaniu do Strefy Klienta. INSTRUKCJA OBSŁUGI PŁYTY DVD Po włożeniu płyty DVD do napędu proszę wybrać opcję Eksploruj (wyświetlić zawartość płyty), a następnie uruchomić plik index.html W razie problemów z odtwarzaniem filmów należy: 1/ Pobrać najnowszy Flash Player® (http://get.adobe.com/pl/flashplayer/) 2/ Zainstalować środowisko Java® (http://www.java.com/pl/download/) 3/ Wyczyścić pliki tymczasowe i uruchomić ponownie przeglądarkę, a jeśli to nie zadziała, w miarę możliwości spróbować uruchomić plik pod inną przeglądarką (np. Firefox®) 4/ W ostateczności zmienić rozszerzenie pliku .flv w folderze video na .mov i sprawdzić, czy film będzie odtwarzał się w QuickTime® Kurs jest w sposób elektroniczny powiązany z właścicielem licencji. Kurs przeznaczony jest do użytku osoby kupującej. Z wyjątkiem sytuacji dopuszczalnych przez prawo, jakiekolwiek powielanie, montaż, wypożyczanie czy inne rozpowszechnianie płyty lub jej zawartości czy fragmentów zawartości jest bezwzględnie zabronione. Książka wraz z płytą DVD nie mogą być przedmiotem odsprzedaży czy sprzedaży handlowej bez uzyskania odpowiedniej licencji. www.eduweb.pl Mateusz Manaj