KURS PHP
|
Co to jest PHP ?
PHP jest jednym z wielu języków programowania, które umożliwiają szybkie tworzenie dynamicznych stron internetowych. Oficjalna nazwa PHP to " PHP: Hypertext Preprocessor " a sam skrót pochodzi od Personal Home Page. Składnią język ten zbliżony jest do C. PHP zostało napisane przez Rasmusa Lerdorfa, w celu poprawienia funkcjonalności własnej strony internetowej. Jego "twór" został spisany przez programistów z całego świata i tak powstał PHP3 a później PHP4 z nowym mechanizmem ( engine ) Zend. PHP został stworzony w celu pracy z WWW i dlatego jest pełnowartościowym językiem programowania umożliwiającym tworzenie aplikacji internetowych. Współpracuje z wieloma bazami danych np. MySQL oraz z usługami sieciowymi np. IMAP, POP3, czy HTTP. PHP może być instalowane na różnych platformach. Rozprowadzane jest głównie w postaci kodu źródłowego dzięki czemu może być skompilowane na wielu platformach np. Linuksie, FreeBSD lub Windows. Może pracować jako program CGI, bądz być zaistalowanym jako moduł APACHE. Może działać z każdym (?) serverem WWW
Instalacja PHP
Oczywistym jest, że instalację należy zacząć od pobrania dystrybucji PHP. Można ją pobrać z witryny www.php.net. Mamy możliwość pobrania kilka rodzajów pakietu. Najlepszy będzie kod źródłowy ale dla mniej zainteresowanych lub leniwych polecam binarną wersję pod Windows.
Instalowanie wersji binarnej dla Windows nie nastręcza trudności. Osobiście polecam program "KRASNAL", który zawiera m.in. serwer APACHE, MySQL oraz PHP.
Kompilacja PHP
Kompilacja kodu w systemach Unixowych jest do siebie podobna - niezależnie jakiego systemu używamy np. Linux, Solaris. Należy pamiętać, że PHP można zainstalować na kilka sposobów. Jeżeli serwerem WWW jest APACHE, wówczas można skompilować PHP jako plik wykonywalny, moduł ładowany dynamicznie lub jako bibliotekę. Poniżej zostanie przedstawiona instalacja PHP jako modułu ładowanego dynamicznie.
Po pobraniu odpowiedniego pakietu i rozpakowaniu go należy tak skompilować APACHE by obsługiwał dynamiczne moduły:
cd <sciezka_apache>
make clean
./configure --enable-module=so --enable-rule=SHARED_CORE --prefix=/www
make
make install
Po odpowiednim przygotowaniu APACHE należy skompilować PHP w następujący sposób:
cd <sciezka_do_php>
make clean
rm config.cache
./configure --with-apxs=/www/bin/apxs (pozostałe opcje konfiguracji)
make
make install
Polecenia "make clean" i "rm config.cache" służą do usunięcia poprzedniej instalacji. Jeśli instalacja jest pierwszą nie trzeba ich używać. Ważną informacją szczególnie dla osób, które jeszcze nie przeprowadzali takiego procesu tj. kompilacji, jest to, że skrypt konfiguracyjny poszukuje w systemie narzędzi, plików i innych danych systemowych potrzebnych do przeprowadzenia kompilacji. Na podstawie tych danych tworzy skrypt kompilujący kod. Może się zdarzyć, że nie będzie wszystkich wymaganych parametrów do przeprowadznia instalacji.
W wyniku procesu kompilacji zostanie stworzony m.in. plik wykonywalny php. Aby sprawdzić poprawność wykonanej kompilacji należy wpisać
php < /dev/null
Wynik postacią zbliżony do :
X-Powered-By PHP/4.0.2
Content-type text/html
oznacza prawidłowo zakończoną kompilację.
Konfiguracja
Sposób konfiguracji PHP jest niezależny od platformy, na której działa. Sprowadza się do modyfikacji pliku php.ini. Osoby nie znające opcji konfiguracji mogą skorzystać z plików dołączonych w pakiecie instalacyjnym: php.ini-optimized oraz php.ini-dist. Wystarczy zmienić nazwę któregoś pliku na php.ini i zgrać do odpowiedniego katalogu. Dla Windows jest to C:\Windows a dla Unix najczęściej /usr/local/lib .
Przykładowe opcje konfiguracji
display_errors:boolean - określa czy mają być wyświtlane błędy
doc_root:string - określa główny katalog PHP na serwerze
error_log:string - określa nazwę pliku, w którym mają być zapiswane błędy
max_execution_time:integer - określa czas w sekundach po jakim analizator przerwie działanie skryptu
safe_mode:boolean - określa czy PHP ma działać w trybie bezpiecznym
browscap:string - nazwa pliku opisującego możliwości przeglądarki
Opcji konfiguracji PHP jest bardzo dużo. Wszystkie są dostępne w witrynie www.php.net.
Składnia języka
PHP jest najczęściej wbudowany w kod HTML dlatego istnieją znaczniki tworzące bloki PHP:
<? echo "Witaj świecie"; ?> -działa tylko z ustawioną opcją short_tag_open w pliku php.ini
<?php echo "Witaj świecie"; ?> - wykorzystanie pełnych znaczników
<script language="php"> echo "Witaj świecie"; </script> - dla edytorów HTML nie obsługujących instrukcji przetwarzania
<% echo "Witaj świecie"; %> - działa tylko z ustawioną opcją asp_tags
Składnią PHP jest zbliżony do języka C. Instrukcje są oddzielane średnikiem.
Komentarze
W PHP stosujemy komentarze takie jak w języku C lub C++ oraz te używane w skryptach Unixa. Komentarze jednoliniowe komentują do końca lini lub do końca bierzącego bloku PHP (w zależności co nastąpi pierwsze). Podobnie jak w C nie można zagnieżdżać wielowierszowych komentarzy.
<?php
print("Witaj świecie <br>"); // Komentarz jednowierszowy w stylu C++
?>
<?php
/* To jest komentarz
wielowierszowy */
print("Witaj świecie <br>");
?>
<?php
print("Witaj świecie <br>"); # A to komentarz w stylu Unixa
?>
<?php
/*
echo "Witaj świecie"; /* Przykład zagnieżdżenia komentarza i spowodowania tym samym błędu */
*/
?>
Typy zmiennych w PHP
W PHP wyróżniamy następujące typy: liczby całkowite, zmiennoprzecinkowe, ciągi, tablice i objekty. Typ zmiennej nie jest jawnie ustalany przez programistę lecz zależy od kontekstu użycia zmiennej. W celu poprawnego zarządzania typami PHP posiada funkcje gettype() settype() is_integer() is_array() itp.
Liczby
Liczby całkowite można przedstawiać w różnych notacjach: dziesiętnej, ósemkowej i szesnastkowej. Liczby zmiennoprzecinkowe można przedstawiać jako notacja zwykła lub zapis naukowy:
<?php
$zmienna1=100; // Liczba dziesiętna
$zmienna2=-100; // Liczba ujemna
$zmienna3=01013; // Liczba 523 w zapisie ósemkowym
$zmienna4=0x20B; // Liczba 523 w zapisie szesnastkowym
$zmienna5=100.100; // Zapis zwykły liczby zmiennoprzecinkowej
$zmienna6=10.0100e2; // Notacja naukowa liczby zmiennoprzecinkowej
?>
Ciągi
Ciągi w PHP ograniczamy cudzysłowami ( " ) lub apostrofami ( ' ). Zapis wpływa na sposób interpretacji ciągu. Gdy zastosujemy cudzysłowy zmienne zawarte pomiędzy nimi zostaną zamienione na ich wartości. Przy zastosowaniu apostrofów zmienne nie są zamieniane.
Znaki specjalne w ciągach zamkniętych cudzysłowami |
|
Sekwencja znaków |
Znaczenie |
\n |
nowa linia |
\r |
powrót karetki CR |
\t |
tabulacja |
\ |
lewy ukośnik |
\" |
cudzysłów |
\$ |
znak dolara |
W PHP ciągi można łączyć ze sobą. Służy do tego kropka ( . ) Podobnie jak w języku C mamy dostęp do każdego znaku ciągu, który traktujemy jako tablicę znaków.
<?php
$ciag="To jest przykład ciągu";
$ciag1="A to inny przykład";
/* Wypisanie ciągów */
print("$ciag"); // Wypisze -> To jest przykład ciągu
print("\"); // Wypisze -> $ciag
print("\' $ciag1 \'"); // Wypisze -> $ciag1
/* Łączenie ciągów */
$zmienna1="PHP";
$zmienna2=" kurs";
$zmienna3=$zmienna1.$zmienna2;
print("$zmienna3"); // Wypisze -> PHP kurs
?>
Tablice
W PHP występują tablice indeksowane (wektory) oraz asocjacyjne. Można również tworzyć tablice wielowymiarowe. Dzięki konstrukcji tablic można jeden wymiar tablicy indeksować liczbą a inny asocjacyjnie. Tablice możemy tworzyć przy pomocy funkcji list() lub array() oraz poprzez jawne przypisanie wartości.
Przykład inicjowania i wykorzystania tablic:
<?php
*/ Tworzenie prostej tablicy */
$a[0]="Kurs";
$a[1]="php";
$a[]="w skryptotece"; // Jawne przypisanie do indeksu 2
$a[]="www.skryptoteka.pl"; //Jawne przypisanie do indeksu 4
/* Tworzenie tablicy asocjacyjnej */
$kierunkowy["Łódź"]="0-42";
$kierunkowy["Warszawa"]="0-22";
$kierunkowy["Piotrków"]="0-44";
/* Tworzenie tablicy asocjacyjnej przy pomocy funkcji array() */
$kierunkowy=array("Łódź"=>"0-42","Warszawa"=>"0-22","Piotrków"=>"0-44");
/* Tworzenie tablicy wielowymiarowej */
$maciez=[0][0]="wartosc";
$zmienna["Wydział"]["Kierunek"]="Informatyka"; // Tworzona asocjacyjnie
$zmienna_a[1]["indeks"]="PHP"; // Indeksowanie liczbowe z asocjacyjnym
?>
Zmienne w PHP są poprzedzane znakiem $, po którym następuje nazwa zmiennej. Nazwa zmiennej musi zaczynać się od litery bądź znaku podkreślenia. W nazwie dopuszczone są litery a-z, A-Z, 0-9 oraz znaki ASCII z zakresu 127-255. Wartości do zmiennych mogą być przypisywane przez samą wartość lub poprzez referencję. Aby przypisać poprzez referencję należy nazwę zmiennej poprzedzić znakiem &. W przypadku przypisania przez wartość zmienne pozostają niezależne, zmiana wartości jednej zmiennej nie ma wpływu na wartość drugiej. W przypadku przypisania przez referencję zmienne skojarzone są ze sobą zależne i zmiana wartości jednej zmiennej wpływa na wartość skojarzonej z nią zmiennej. Wielkość liter jest istotna w nazwie zmiennej tj. $Nazwa i $nazwa to dwie różne zmienne.
<?php
$_zmienna="Skryptoteka";
$zmienna=$_zmienna; //Przypisanie poprzez wartość
print("$_zmienna $zmienna"); // Wypisze -> Skryptoteka Skryptoteka
$_zmienna="www.skryptoteka.pl";
print("$_zmienna $zmienna"); // Wypisze -> www.skryptoteka.pl Skryptoteka
/* Przypisanie przez referencję */
$_zmienna=&$zmienna;
print("$_zmienna $zmienna"); // Wypisze -> Skryptoteka Skryptoteka
$zmienna="120";
print("$_zmienna $zmienna"); // Wypisze -> 120 120
?>
Zmienne predefiniowane
PHP oprócz zmiennych tworzonych przez użytkownika posiada szereg zmiennych tworzonych przez system. Zmienne te zależą od wielu czynników np. wersja PHP, serwera WWW. PHP tworzy także zmienne dla danych przesyłanych z formularza metodą POST, GET oraz zmienne plików cookies. Do obejrzenia wszystkich zmiennych służy funkcja phpinfo().
Przykładowe zmienne predefiniowane |
|
Sekwencja znaków |
Znaczenie |
REMOTE_ADDR |
Adres IP oglądającego stronę |
SERVER_PROTOCOL |
Nazwa i wersja protokołu |
PHP_SELF |
Nazwa pliku z wykonywanym skryptem |
PHP_COOKIE_VARS |
Tablica asocjacyjna zmiennych cookie |
PHP_GET_VARS |
Tablica asocjacyjna zmiennych GET |
PHP_POST_VARS |
Tablica asocjacyjna zmiennych POST |
REMOTE_PORT |
Port WWW klienta |
Wszystkie zmienne predefiniowane są opisane w manualu PHP
Stałe
W PHP można definiować stałe. Używa się do tego funkcji define()
<?php
define("nazwastalej","jejwartosc");
define("Ulica","Warszawska");
print(Ulica); // wypisze -> Warszawska
?>
PHP posiada dodatkowo kilka stałych predefiniowanych.
Instrukcje warunkowe - if, else, elseif
Instrukcja if służy do organizacji sterowania poprzez tworzenie warunków na podstawie wyrażeń logicznych.
<?php
if(1<2)
{
echo "Warunek if został spełniony";
}
else
{
echo "Wypisze jeśli warunek if nie został spełniony";
}
$kolor="czerwony";
if($kolor=="zielony")
{
echo "Warunek if został spełniony";
}
elseif($kolor=="żółty")
{
echo "Wypisze jeśli warunek elseif został spełniony";
}
else
{
echo "Wypisze jeśli warunek else został spełniony";
}
?>
Pętle
W PHP wyróżniamy cztery pętle. Ich działanie jest podobne do pętli języka C i innych języków wysokiego poziomu.
<?php
// Pętla while
$warunek=0;
while($warunek<10)
{
echo "$warunek"; $warunek++;
}
// Pętla do..while
$warunek=0;
do
{
echo "$warunek"; $warunek++;
}
while($warunek<10)
?>
Pętle while i do..while są zasadą działania do siebie podobne. Obie wykonują się do czasu gdy ich warunek jest spełniony tj. dopóki ($warunek<10) jest prawdą. Jedyną różnicą pomiędzy nimi jest to, że jeśli warunek ($warunek<10) nie jest spełniny już na samym początku pętla while nie wykona się ani razu natomiast pętla do..while wykona się dokładnie raz. W pierwszym przypadku warunek pętli jest sprawdzany na początku, w drugim na końcu.
<?php
// Pętla for
for($index=0;$index<10;$index++)
{
echo "$index";
}
?>
Pętla for jest najbardziej złożoną pętlą PHP. Składnią jest taka sama jak w języku C.
for(wyrażenie1;wyrażenie2;wyrażenie3) { instrukcje }
Wyrażenie1 jest sprawdzane raz na początku wykonywania pętli. Wyrażenie2 jest obliczane przy każdorazowym przejściu pętli i pętla jest wykonywana do czasu gdy wyrażenie2 jest równe TRUE tzn. dopóki jest spełnione. Wyrażenie3 jest sprawdzane przy każdym przejściu pętli. Każde z tych wyrażeń może zostać opuszczone. Jeżeli opuści się wyrażenie2 to jego wartość zawsze będzie TRUE.
<?php
// Przykład opuszczenia wyrażenia pętli for
for(;$index<10;$index++)
{
echo "$index";
}
?>
Ostatnią pętlą PHP jest foreach która umożliwia wygodne przeglądanie tablic. Posiada dwie postacie:
foreach(tablica as wartosc) { instrukcje }
foreach(tablica as klucz => wartosc) { instrukcje }
Pierwsza postać pętli przelatuje przez tablicę i w każdym przebiegu wartość bieżącej komórki zapisywana jest w zmiennej wartosc. Druga postać pętli wykonuje to samo dodatkowo zapisując bieżący klucz komórki do zmiennej klucz.
Instrukcja switch
Instrukcja switch jest uproszczeniem wielokrotnych warunków if..elseif..else. Składnia i implemantacja tej funkcji jest taka sama jak w C. Ważną zasadą jest stosowanie instrukcji break().
<?php
$kolor="red";
switch($kolor)
{
case "green": { print("#00FF00");break; }
case "blue": { print("#0000FF");break; }
case "red": { print("#FF0000");break; }
default: { print("Nie znaleziono podanego koloru");break; }
}
?>
Instrukcja break powoduje zatrzymanie wykonywania switcha. Pominięcie jej spowoduje wykonanie warunku prawidłowego oraz wszystkich pozostałych będących w hierarchii poniżej.
Instrukcje break i continue
Obie instrukcje znane z C pozwalają na sterowanie pętlami. Obie pozwalają na podanie wartości liczbowej jako parametru mówiącego ile zagnieżdżonych pętli należy przerwać lub rozpocząć ich wykonywanie od początku. Instrukcja break kończy wykonywanie bieżącej konstrukcji, np. pętli lub switch. Instrukcja continue jest używana tylko w pętlach. Jej wywołanie powoduje opuszczenie pozostałych instrukcji pętli i rozpoczęcie nowej iteracji.
Funkcje
W PHP można tworzyć własne funkcje. Nie muszą być wcześniej deklarowane (PHP4). Funkcja w PHP może posiadać następujące cechy: zmienną liczbę argumentów, argumenty domyślne, argumenty przekazywane przez referencję. W ciele funkcji mogą być wykonywane dowolne funkcje, jedna fukcja może wywoływać inną czyli dozwolona jest rekurencja. Domyślnie zmienna jest przekazywana do funkcji poprzez wartość. Aby przekazać poprzez referencję należy nazwę zmiennej poprzedzić znakiem &. Argumenty domyślne muszą być umieszczone po argumntach obowiązkowych.
<?php
//Zdefiniowanie własnej funkcji
function suma($a,$b)
{
return$a+$b;
}
$wynik=suma(2,3); //Wywołanie funkcji
//Przekazanie wartości poprzez referencję
function dodaj(&$a)
{
$a++;
return $a;
}
?>
COOKIES
COOKIE to mały plik mogący zawierać dowolną informację. Plik ten jest zapisywany nie na serwerze a na komputerze klienta. PHP posiada jedną funkcję do tworzenia ciasteczek - setcookie. Funkcja setcookie musi być wywołana przez wysłaniem jakichkolwiek danych do przeglądarki (chyba, że zastosuje się buforowanie).
setcookie("nazwa","wartość","czaswygaśnięcia","ścieżka","domena","tryb");
Wszystkie wartości oprócz nazwy są opcjonalne. Wywołanie setcookie tylko z nazwą spowoduje usunięcie ciasteczka o podanej nazwie. Czaswygaśnięcia jest standardowym czasem Unixa, który można uzystać poprzez działanie funkcji mktime(). Parametr tryb informuje czy ciasteczko ma być wysłane połączeniem bezpiecznym HTTPS. Przyjmuje wartości 0 lub 1.
<?php
//Ustawienie ciasteczka
setcookie("imie","Tomek");
//Ustawienie ciasteczka wygasającego po dwóch tygodniach
setcookie("data","2004-02-04",time()+60*60*24*14);
?>
Przy obsłudze cookie należy pamiętać o trzech istotnych sprawach:
cookie należy ustawiać przed wysłaniem czegokolwiek do przeglądarki
cookie nie będzie widoczne do czasu ponownego przeładowania skryptu
każda przeglądarka w różny sposób obsługuje i przechowuje ciasteczka niezależnie tzn. cookie ustawione poprzez jedną przeglądarkę nie będzie widoczne po uruchomieniu strony poprzez inną przeglądarkę.
Ustawione ciasteczko jest dostępne w skrypcie jako zmienna PHP.
Obsługa plików
PHP jak większość języków programowania umożliwia obsługę plików. Można je tworzyć, modyfikować,zapisywać lub odczytywać. PHP udostępnia funkcje do obsługi plików podobne jak w C, podobnie używa uchwytów do plików. Obsługę plików należy wykorzystywać "z głową" by nie spowodować luki w bezpieczeństwie systemu. Do tworzenia uchwytów plików używamy m.in. funkcji fopen
fopen("nazwa","mode")
Parametr nazwa może przyjmować cztery wartości: "http://" - zostanie zwrócony wskaźnik pliku odpowiedzi, "ftp://" - zostanie nawiązane połączenie ftp i zwrócony wskaźnik do podanego pliku, "php://stdin" (lub "php://stdout", lub "php://stderr") - zostanie otwarty standardowy strumień. Jeśli nazwa będzie zaczynała się inaczej niż powyższe przykłady zostanie otwarty plik z systemu plików, o podanym adresie. Każdy plik należy zamknąć. Używa się do tego funkcji fclose(nazwauchwytu). Parametr mode może przyjmować wartości:
Tryby otwierania plików |
|
Tryb |
Znaczenie |
r |
Tylko do odczytu |
r+ |
Do odczytu i zapisu |
w |
Tylko do zapisu. Tworzy nowy plik lub kasuje stary jeśli istnieje |
w+ |
Do odczytu i zapisu.Tworzy nowy plik lub kasuje stary jeśli istnieje |
a |
Tylko do zapisu. Nie kasuje istniejącego pliku lecz dopisuje na jego końcu |
a+ |
Do odczytu i zapisu. Nie kasuje istniejącego pliku lecz dopisuje na jego końcu |
Do pobierania wartości z pliku służy funkcja fgets($uchwytpliku,$liczba) gdzie $liczba jest ilością znaków-1 jaką chcemy pobrać z pliku. Funkcja ta kończy wykonywanie jeśli pobierze ilość znaków-1, napotka znak końca lini lub znak końca pliku. Do wpisywania danych do pliku służy funkcja fputs($uchwytpliku,$ciąg) gdzie $ciąg jest ciągiem, który chcemy wpisać do pliku. Parametr mode może przyjąć jeszcze jedną wartość b, która otwiera plik binarny. Jednak działa to tylko w systemach, które rozróżniają tryby binarny i tekstowy. Czyli w Unixach i tak nie zadziała.
<?php
// Otwarcie pliku poprzez HTTP
$plik=fopen("http://adres.pl/index.php","r");
$ciag=fgets($plik,100); //Pobieranie z pliku 99 znaków
echo "$ciag";
fclose($plik);
// Otwarcie pliku poprzez FTP
$plik=fopen("ftp://user:haslo@adres_ftp","w");
//Otwarcie zwykłego pliku z systemu plików
$plik=fopen("/home/users/nick/plik.cc","r+");
fputs($plik,"Ala ma kota"); // Wpisywanie do pliku podanego ciągu
fclose($plik); // Zamykanie pliku
?>
Obsługa baz danych w PHP na przykładzie MySQL
PHP jak wiele języków programowania umożliwia współpracę z bazami danych. Posiada bardzo wiele mechanizmów obsługi baz, np. indeksowanie, relacje, obsługa transakcji. PHP obsługuje bazy danych poprzez zestaw różnych funkcji. Każda baza posiada swój zestaw np. dla bazy MySQL funkcje zaczynają się od mysql_. Pomimo, że każda baza posiada własny zestaw funkcji, dostęp do nich z poziomu PHP polega na tym samym. Poniżej prezentuję schemat obsługi bazy według Blake Schwendimana:
<?php
połącz_z_bazą();
wybierz_bazę();
wyślij_zapytanie();
pobierz_wyniki();
while(isnieje_wiersz)
pobierz_wiersz();
zamknij_połączenie();
?>
Tak pokrótce wygląda schemat obsłużenia bazy danych. Aby jednak rozpocząć zabawę z bazami należy najpierw zainstalować jakąś. W niniejszym kursie zostanie przedstawiona baza MySQL. Jej wersję możemy pobrać z www.mysql.com. Mamy możliwość pobrania trzech rodzajów pakietów. Wersji binarnej dla Windows, źródła lub plik RPM. PHP ma wbudowaną obsługę MySQL więc nie trzeba specjanie kompilować języka. Po zainstalowaniu odpowiedniego pakietu można zacząć pracę z bazą danych.
<?php
$polaczenie=mysql_connect("host","uzytkownik","haslobazy"); /* Nawiązanie połączenia z bazą */
mysql_select_db("bazadanych",$polaczenie); /* Wybranie odpowiedniej bazy danych */
$sql="SELECT imie,nazwisko FROM dane_pracownika";
$wynik=mysql_query($sql); /* Zapytanie sql do bazy i zapisanie wyniku w $wynik */
while($linia=mysql_fetch_array($wynik)) /* Pętla dopóki istnieją dane */
echo "$linia["imie"] $linia["nazwisko"]";
mysql_close($polaczenie);
?>
Powyższy kod powinien prawidłowo połączyć się z bazą danych, wybrać odpowiednią bazę, następnie wysłać do niej zapytanie sql o imię i nazwisko i ostatecznie wyświetlić wszystkie linie z wyniku zapytania i zamknąć połączenie. W zapytaniu sql można stosować dowolne zapytania np. select, insert, update itp. PHP posiada bardzo dużo funkcji do obsługi bazy MySQL, opis wszystkich znajduje sie w manualu PHP. Poniżej prezentuję kilka przydatnych funkcji w codziennej pracy:
mysql_num_rows($wynik_zapytania) - zwraca ilość wierszy zwróconych przez zapytanie
mysql_num_fields($wynik_zapytania) - zwraca ilość pól zwróconych przez zapytanie
mysql_list_dbs($polaczenie) - zwraca wszystkie nazwy baz znajdujących się na serwerze
mysql_connect(host,uzytkownik,hasło) - połączenie z bazą danych
mysql_query($zapytanie) - wykonanie zapytania do bazy danych
Wysyłanie poczty w PHP
Wysłanie poczty z poziomu PHP jest bardzo prostym zadaniem. Język ten posiada jedną funkcję wysyłającą maile. Jest to:
mail(do_kogo,temat,treść,dodatkowe_nagłówki)
Pierwsze trzy argumenty funkcji mail są jasne. Dodatkowe_nagłówki muszą być zawsze na końcu i zawsze oddzielone nową linią. Przykład wysłania maila z dodatkowymi nagłówkami:
<?php
$adres="noone@wp.pl";
$temat="Mój temat maila";
$tresc="Cześć ! Właśnie czytam o PHP. A ty co robisz ?";
/* Dodatkowe nagłówki */
$nagłówek="From: Somebody <somebody@wp.pl> "; // Od kogo
$nagłówek.="Reply-To: Somebody <somebody@wp.pl> "; // Adres zwrotny
$nagłówek.="X-Mailer: PHP "; // Klient poczty
$nagłówek.="X-Priority: 1 "; // Priorytet wiadomości
$nagłówek.="Return-Path: <somebody@wp.pl> "; // Adres zwrotny dla błędów
mail($adres,$temat,$tresc,$nagłówek); // Wysłanie maila
?>
W nagłówku możemy umieścić także typ MIME
Bezpieczeństwo w PHP
Aby można było mówić o bezpieczeństwie w sieci należy zacząć od samej transmisji danych. Protokół TCP/IP nie posiada wbudowanych funkcji szyfrujących. Także HTTP, korzystający z TCP/IP nie zapewnia bezpieczeństwa danych. Wszystkie strony internetowe oraz dane są przesyłane w sposób jawny i narażone tym samym na śledzenie i przechwytywanie. Aby takiej sytuacji zapobiec stosuje się metody kryptograficzne. Często w celu stworzenia bezpiecznego połączenia pomiędzy komputerami stosuje się protokół SSL, który zapewnia szyfrowanie na zadowalającym poziomie. Szyfrowanie przebiega z zastosowaniem klucza prywatnego i publicznego.
Istotną sprawą jeśli chodzi o bezpieczeństwo jest ukrywanie kodu. Jeśli potencjalny włamywacz nie wie co skrypt robi, jaka jest architektura naszej bazy danych, może tylko zgadywać. Co może być czasochłonne i bezcelowe. Jeśli serwery WWW i PHP pracują prawidłowo nie ma możliwości podejrzenia kodu PHP strony poprzez stronę internetową. Co jednak gdy serwer PHP lub WWW będzie miał awarię ? Jeśli serwer WWW nieprawidłowo zainstaluje PHP to może zamiast wykonania skryptu wyświetlić jego kod. Należy zatem zadbać by pliki zawierające login i hasło do bazy danych nie były dostępne z poziomu serwera WWW a do skryptu dołączane poprzez funkcję include. Np:
<?php
include("../../../hasla.php");
?>
Tak dołączony plik nie będzie dostępny z poziomu adresu URL w przypadku nieprawidłowego działania serwera WWW lub PHP. Można też do ochrony skryptu zastosować funkcję error_reporting(0). Przy takim ustawieniu nie zostanie wyświetlony żaden błąd w trakcie wykonania skryptu (jeśli taki zaistnieje) i potencjalny włamywacz nie pozna nazwy funkcji czy pliku jaki używamy.
Inną istotną sprawą jest przesyłanie danych z formularzy. Można je przesyłać na dwa sposoby. Poprzez post i get. Odradza się stosowanie get ponieważ dane wysyłane tą metodą są jawnie dołączone do adresu URL. Np po wysłaniu swojego hasła z formularza poprzez get wyświetli się adres:
http://212.191.65.5/skrypt.php?mojehaslo=haslo
Osoba stojąca z boku bez problemu może dojrzeć nasze hasło. Tak samo należy pamiętać, że jeśli pobieramy od użytkownika hasło poprzez formularz, powinniśmy zastosować opcję password. Zapewnimy tym samym poufność wpisywanych danych ponieważ zamiast znaków hasła będą wyświetlały się ******.
Aby zapewnić bezpieczeństwo skryptom należy zawsze inicjować zmienne oraz kożystać z talic $HTTP_COOKIE_VARS, $HTTP_POST_VARS, $HTTP_GET_VARS a nie globalnych zmiennych. Zabezpieczymy się przed ingerencją włamywacza poprzez inicjowanie zmiennych dzięki adresowi URL.
Bardzo dużym i istotnym zagrożeniem jest wykonywanie poleceń systemowych z wykożystaniem zmiennych podanych przez użytkownika. Przykład: pobieramy od użytkownika jego nick (poprzez formularz). Następnie wykonujemy zapytanie do bazy danych:
<?php
$sql="SELECT haslo FROM tabela WHERE nick='$HTTP_POST_VARS['nick']'";
mysql_query($sql);
?>
Wszystko wydaje się być prawidłowe ale ... Co jeśli użytkownik poda jako swój nick ciąg
'; DELETE FROM tabela;
Nasze zapytanie do bazy będzie miało postać:
<?php
$sql="SELECT haslo FROM tabela WHERE nick='';DELETE FROM tabela";
mysql_query($sql);
?>
Powyższe zapytanie nic nie wyświetli a usunie nam wszystkie dane z tabeli tabela. Jeśli użytkowników było trzech to nic sie raczej nie stało. Jednak jeśli użytkowników było 50.000 to mamy chyba ogromny problem.
Aby zapobiec takim sytuacją należy filtrować wszystkie znaki specjalne MySQL poprzez funkcję mysql_escape_string.
<?php
$poprawne=mysql_escape_string($HTTP_POST_VARS['nick']);
$sql="SELECT haslo FROM tabela WHERE nick='$poprawne'";
mysql_query($sql);
?>
Teraz nasze zapytanie jest zabezpieczone przed w/w sytuacją. Obecne dystrybucje MySQL i PHP nie zezwalają na łączenie zapytań jednak należy przestrzegać powyższych zasad na wypadek zmiany systemu itp.
Podobna sytuacja występuje jeśli wykonujemy polecenie systemowe serwera pobierając parametry od użytkownika. Przykład: pobieramy od użytkownika parametry poprzez formularz i stosujemy je do polecenia:
<?php
system("w $parametr");
?>
Jest to kolejny przykład niezabezpieczonego kodu ponieważ włamywacz może jako parametr w formularzu podać:
;ps -aux lub ;cat /etc/passwd lub dowolny inny
Zapytanie takie wyświetli procesy w systemie lub plik z hasłami. A co jeśli włamywaczowi uda się dostać do jądra systemu? Może załamać cały system.
Zabezpieczenie takiego skryptu jest analogiczne jak w przypadku bazy danych tylko z wykożystaniem funkcji escapeshellcmd.
PHP zostało napisane tak by umożliwiać łatwe dołączanie plików. Z tą sytuacją też są związane pewne niebezpieczeństwa. Jeśli włamywaczowi uda się jakoś zmienić wartośc $PATH to może do naszego skryptu dołączyć swój dowolny plik PHP. Taki plik może wyświetlić wszystkie zmienne globalne (co umożliwi włamywaczowi poznanie naszego hasła bazy itp) oraz wykonanie innych potencjalnie niebezpiecznych funkcji. Aby ustrzec się przed takimi zagrożeniami należy unikać dołączania plików. Innym sposobem zabiezpieczania jest zabezpieczanie z poziomu serwera. Ustawienie opcji safe_mode jako on uniemożliwi wykonywanie poleceń systemowych poziomy WWW i skryptów, safe_mode_exec_dir - ustalamy jakie katalogi mogą być dostępne z poziomu PHP, safe_mode_allowed_env_vars - określa jakie zmienne środowiskowe mogą być zmieniane przez skrypt PHP. To nie wszystkie opcje zabezpieczeń tylko przykład kilku.
Żaden skrypt nie jest zabezpieczony w 100%. Pewien mądry człowiem kiedyś powiedział: " Nie ma skryptów bez luk, są tylko takie, w których tych luk jeszcze nie znaleziono". Dlatego warto zawsze pracować by ulepszyć swój skrypt pod względem bezpieczeństwa. Wyżej przedstawione luki to tylko przykłady, ktorych znam jeszcze trochę. A ile jest ich naprawdę? Chyba tyle ilu dobrych włamywaczy !!!