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

Podobne dokumenty