PHP
PHP: Hypertext Preprocessor
PHP: Hypertext Preprocessor
• Jest to język programowania
osadzany w
HTML
składniowo podobny do
C
,
Perla
i
Javy
• PHP to język programowania
przeznaczony dla programistów WWW
pozwalający na szybkie tworzenie
dynamicznych aplikacji WWW
Prosty przykład kodu PHP
• <html>
•
<head>
•
<title>Prosty przykład kodu
PHP</title>
•
</head>
•
<body>
•
<?php
•
echo "Witajcie w PHP!" ;
•
?>
•
</body>
• </html>
Preprocesor PHP
• Preprocesor PHP wykonuje cały kod zawarty
pomiędzy znacznikami
<?php
i
?>
umieszczonymi w kodzie HTML i zwraca wynik
w postaci tekstu.
• Kod ten jest wykonywany na serwerze WWW a
nie na kliencie.
• Przeglądarka nie wie, że do stworzenia strony
był używany PHP.
Dlaczego PHP
• PHP jest pełnowartościowym językiem
programowania.
• PHP współpracuje z wieloma systemami
baz danych.
• Możliwy jest również dostęp do usług
sieciowych takich jak IMAP, POP3, NNTP
i TTP.
• PHP może być użyty we wielu
konfiguracjach serwerów.
Wolne oprogramowanie
• www.php.net
przechowuje kod źródłowy i
skompilowane moduły PHP.
• PHP jest dostępne na różne platformy.
• PHP można uruchomić z lini poleceń.
• PHP może działać w modelu CGI
• Istnieje wiele dobrych bibliotek funkcji.
• Można programować obiektowo.
• PHP nie wymaga opłat licencyjnych
Konfigurowanie PHP
• Konfigurowanie PHP zostaw
administartorowi systemu.
• Jeśli sam jesteś administratorem:
– zapoznaj się dokładnie z dokumentacją
– pomyśl o jakiejś polityce bezpieczństwa
– przeanalizuj
php.ini
– dostosuj
php.ini
– jeśli to nie wystarczy, kompiluj PHP z
własnymi opcjami.
Sposoby oznaczania bloku kodu
PHP w HTML
• <?
echo "użycie krótkich znaczników PHP
do wyjścia z trybu HTML<br>"; ?>
• <?php
echo "wyjście przy użyciu pełnych
znaczników PHP<br>"; ?>
• <script language="php">
•
echo "niektóre edytory HTML nie
obsługują instrukcji przetwarzania<br>";
• </script>
• <%
echo "można stosować również znaczniki
w stylu ASP<br>"; %>
Komentarze w PHP
•
<?php
•
echo "Witaj świecie!<br>";
//
To jest jednowierszowy komentarz w
stylu C++
•
/*
To jest wielowierszowy
•
blok komentarza
*/
•
echo "Witamy ponownie.<br>";
#
To jest komentarz w stylu skryptów
Uniksa
•
?>
•
<?php
•
/* Poniższa linia spowoduje wypisanie "To wyświetli
•
nic."
•
*/
•
?>
•
To wyświetli <?php # echo "coś"; ?> nic.<br>
•
<?php
•
/*
•
echo "A tutaj mamy problem."; /* Komentarz ten jest
•
nieprawidłowy */
•
*/
•
?>
Typy
• liczby zmiennoprzecinkowe,
• liczby całkowite,
• ciągi,
• tablice
• obiekty
Typ zmiennej jest ustalany w oparciu o
kontekst w jakim jest użyta zmienna i nie
jest on jawnie ustalany przez programistę
.
Liczby — całkowite i
zmiennoprzecinkowe
• <?php
•
$int1 = 523; // liczba dziesiętna
•
$int2 = -523; // dziesiętna ujemna
•
$int3 =
01013; // ósemkowa reprezentacja liczby 523
•
$int4 =
0x20B; // szesnastkowa reprezentacja liczby
523
•
$float1 = 523.197; // zwykły zapis liczby
zmiennoprzecinkowej
•
$float2 = 5.23197e2; // notacja naukowa liczby
zmiennoprzecinkowej
•
/* Wypisanie wszystkich liczb.
•
Wyświetla "523, -523, 523, 523, 523.197, 523.197".
*/
•
print( "$int1, $int2, $int3, $int4, $float1,
$float2<br>" );
• ?>
Ciągi
• Ciągi w PHP są ograniczane apostrofami (
'
) lub
cudzysłowami (
"
).
• Jeżeli ciąg jest otoczony cudzysłowami, zmienne
zapisane w ciągu zostają zamienione na ich
wartości.
• Ciągi mogą być łączone przy użyciu operatora
kropki
(
.
).
• Podobnie jak w języku C, mamy dostęp do
poszczególnych znaków ciągu, traktując go jak
tablicę znaków
.
Zasady konwersji
• Jeżeli ciąg zaczyna się od danych
numerycznych, zostaną one skonwertowane na
liczbę.
• Jeżeli ciąg nie zaczyna się prawidłowymi danymi
liczbowymi, wartością ciągu będzie zero (0).
• Jeżeli dane numeryczne zawierają jeden ze
znaków
.
,
e
lub
E
, wartość będzie liczbą
zmiennoprzecinkową a w przeciwnym
przypadku liczbą całkowitą.
Tablice
• Tablice w PHP zachowują się zarówno tak jak
tablice indeksowane
(wektory) oraz jak tablice
mieszające (
asocjacyjne
).
• PHP pozwala na tworzenie tablic
wielowymiarowych.
• Można indeksować jeden wymiar tablicy
wielowymiarowej liczbami a inny w sposób
asocjacyjny.
• W przypadku tablic wielowymiarowych należy
użyć
nawiasów klamrowych
do zaznaczenia
indeksów.
Asocjacje
• // Tworzenie tablicy asocjacyjnej
•
$color["niebieski"] = "#0000FF";
•
$color["zielony"] = "#00FF00";
•
$color["czerwony"] = "#FF0000";
•
• // Tworzenie tej samej co poprzedniej tablicy
• // tylko nieco prościej
•
$color = array( "niebieski" => "#0000FF",
•
"zielony" => "#00FF00",
•
"czerwony" => "#FF0000" );
Zmienne
• Zmienne PHP są oznaczane znakiem dolara (
$
)
• Wielkość liter w nazwach zmiennych
jest rozróżniana
.
• Prawidłowe nazwy zmiennych muszą zaczynać się
literą
lub
znakiem podkreślenia
, po których może nastąpić
litera, liczba lub znak podkreślenia.
• Gdy wartości są przypisywane przez referencję,
nowa
zmienna staje się odwołaniem do oryginalnej zmiennej
.
Zmiana wprowadzona do dowolnej zmiennej powoduje
zmianę drugiej. Aby wykonać przypisanie przez
referencję, należy poprzedzić nazwę znakiem
&
.
$
variable3 =
&$
variable1;
print( "$variable1, $variable3<br>" );
Wersja specyfikacji CGI używanej przez serwer, na
przykład CGI/1.1.
GATEWAY_INTERFACE
Nazwa i wersja protokołu za pomocą którego
zostało wysłane żądanie strony, na przykład
HTTP/1.1.
SERVER_PROTOCOL
Adres IP użytkownika oglądającego stronę.
REMOTE_ADDR
Zawartość nagłówka
User Agent:
wysłanego przez
przeglądarkę. Nagłówek ten opisuje
przeglądarkę żądającą strony, na przykład:
„
Mozilla/4/0 (compatible; MSIE 5.01; Windows
NT)
”. Więcej na temat wykorzystania tej
zmiennej znajduje się
w rozdziale 9
„Niezależność od przeglądarki”.
HTTP_USER_AGENT
Zawartość nagłówka
Host:
o ile został wysłany
przez przeglądarkę.
HTTP_HOST
Definicja
Zmienna
Zmienne środowiska serwera
Apache
Zmienne środowiska systemu
System operacyjny działający na serwerze,
na przykład Linux.
OSTYPE
Systemowa ścieżka serwera.
PATH
Typ komputera, na przykład i386.
HOSTTYPE
Nazwa komputera serwera.
HOSTNAME
Definicja
Zmienna
Zmienne generowane przez PHP
Tablica asocjacyjna zmiennych
przekazanych do skryptu za pomocą
metody POST.
HTTP_POST_VARS
Tablica asocjacyjna zmiennych
przekazanych do skryptu za pomocą
metody GET.
HTTP_GET_VARS
Tablica asocjacyjna zmiennych
przekazanych do skryptu poprzez
cookie HTTP.
HTTP_COOKIE_VARS
Nazwa pliku z wykonywanym skryptem.
PHP_SELF
Definicja
Zmienna
Operatory arytmetyczne
Reszta z dzielenie
$a przez $b
$a % $b
Reszta z dzielenia
%
Iloraz $a i $b
$a / $b
Dzielenie
/
Iloczyn $a i $b
$a * $b
Mnożenie
*
Różnica $a i $b
$a - $b
Odejmowanie
-
Suma $a i $b
$a + $b
Dodawanie
+
Wynik
Przykład
Nazwa
Operator
Operatory bitowe
Przesunięcie bitów w $a
w prawo o $b
kroków
$a >> $b
Przesunięcie w prawo
>>
Przesunięcie bitów w $a
w lewo o $b kroków
$a << $b
Przesunięcie w lewo
<<
Bity ustawione nie są
teraz ustawione i
odwrotnie
~$a
Negacja
~
Bity ustawione w $a lub
$b, ale nie w obu na
raz są ustawione
$a ^ $b
Różnica symetryczna
^
Bity ustawione w $a lub
$b są ustawione
$a | $b
Suma bitowa
|
Bity ustawione w $a i $b
są ustawione
$a & $b
Iloczyn bitowy
&
Wynik
Przykład
Nazwa
Operator
Operatory porównania
True, jeżeli $a jest
większe lub równe
$b
$a >= $b
Większy lub równy
>=
True, jeżeli $a jest
mniejsze lub równe
$b
$a <= $b
Mniejszy lub równy
<=
True, jeżeli $a jest
większe od $b
$a > $b
Większy
>
True, jeżeli $a jest
mniejsze od $b
$a < $b
Mniejszy
<
True, jeżeli $a jest
różne od $b
$a != $b
Różny
!=
True, jeżeli $a jest
równe $b i są one
tych samych typów
$a === $b
Identyczny
===
True, jeżeli $a jest
równe $b
$a == $b
Równy
==
Wynik
Przykład
Nazwa
Operator
Stałe
• Aby zdefiniować nową stałą używa się
funkcji
define()
<?php
define( "aString", "To jest stały ciąg znaków" );
define( "aNumber", 1 );
print( "Mamy tutaj zdefiniowane " . aNumber . " stałych.<br>"
);
print( "Jej wartością jest '" . aString . "'<br>" );
?>
Programowanie przepływu
sterowania
• if, else, elseif
• while
• do .. while
• for
• foreach
–
foreach ( tablica as zmienna_wartosc) instrukcja
–
foreach ( tablica as zmienna_klucz => zmienna_wartosc) instrukcja
• switch
• break i continue
include i require
• Wyrażenie
include()
jest zwykłą funkcją
PHP
• Wyrażenie
require()
jest konstrukcją
językową
Funkcje
• PHP pozwala na tworzenie funkcji
definiowanych przez użytkownika
• Funkcje nie muszą być deklarowane przed ich
użyciem w kodzie PHP4
• PHP nie pozwala na przeciążanie funkcji, nie ma
również mechanizmu usuwania lub
przedefiniowania wcześniej zdefiniowanych
funkcji
• Domyślnie argumenty są przekazywane przez
wartość
Przekazanie argumentu przez referencję
// przekazanie argumentu przez referencję
function StringAppend(
&$
BaseString,
$
AddString )
{
// ponieważ jest to przekazane przez referencję, wartość
// $BaseString może być zmieniona poza tą funkcją
$BaseString .= $AddString;
}
wartości domyślne
function PrintAnchorTag( $aHREF, $aText,
$aTarg = ""
){
...
}
Funkcja ta może być wywołana przy użyciu jednej z
postaci:
PrintAnchorTag( "href", "text" );
PrintAnchorTag( "href", "text",
"target"
);
zmienna lista argumentów
function PrintEverything( )
{
$aNumArgs =
func_num_args();
for ( $nIndex = 0; $nIndex < $aNumArgs; $nIndex++ )
{
$aArgVal =
func_get_arg( $nIndex );
print( "Argument $nIndex: $aArgVal<br>" );
}
}
Programowanie obiektowe
• Dostępne jest dziedziczenie
jednobazowe
,
• nie ma dziedziczenia wielobazowego.
• Istnieją konstruktory klas,
• nie ma destruktorów
.
• PHP posiada
(i wymaga używania)
wskaźnik
$this
, który jest stosowany do
odwoływania się do metod i zmiennych
obiektu.
tworzenie prostej klasy
class ShoppingBasket
{
var $fItems;
var $fCurValue;
function
ShoppingBasket
( $aInitialValue = 0.0 )
{
$this->fCurValue
= $aInitialValue;
}
// Dodanie określonej ilości przedmiotów
function AddItem( $aName, $aValue,
$aQuantity = 1 )
{
$this->
fItems[$aName]["Quantity"] +=
$aQuantity;
$this->
fItems[$aName]["Value"] =
$aValue;
$this->
fCurValue += $aValue *
$aQuantity;
return True;
}
}
Tworzenie nowego obiektu
• $aBasket =
new
ShoppingBasket( 3.50 );
• $aBasket->
PrintBasket();
• $aBasket->AddItem( "gizmo", 1.50 );
• $aBasket->PrintBasket();
Obsługa formularzy w PHP
<!-- To jest strona HTML, listing1.html -->
<html>
<head>
<title>Wydruk 3.1 - listing1.html</title>
</head>
<body>
<form action="post1.phtml" method="post">
Nazwa użytkownika: <input type="text"
name="Username"><br>
Hasło: <input type="password"
name="Password"><br>
<input type="submit" name="Submit"
value="Wyślij">
</form>
</body>
</html>
Obsługa formularzy w PHP
<!-- To jest skrypt PHP, post1.html -->
<html>
<head>
<title>Wydruk 3.1: post1.phtml</title>
</head>
<body>
<?php
print( "Nazwa użytkownika: $Username<br>" );
print( "Hasło: $Password<br>" );
?>
</body>
</html>
Wielowartościowe elementy formularza
<!-- Nazwy są indeksami tablicy -->
<select name="
Colors[]
" size="5"
multiple
>
<option value="Red">Czerwony</option>
<option value="Green">Zielony</option>
<option value="Blue">Niebieski</option>
<option value="Purple">Purpurowy</option>
<option value="Yellow">Żółty</option>
</select>
Wielowartościowe elementy formularza
<!-- Trzy linie na dane adresowe.
Używamy notacji tablicowej
aby zaznaczyć użycie wielu wierszy tablicy -->
<input type="text" name="
address[]
"><br>
<input type="text" name="
address[]
"><br>
<input type="text" name="
address[]
"><br>
Metody odczytywania wartości z
formularza
• Predefiniowane zmienne tablicowe
HTTP_GET_VARS
lub
_GET
i
HTTP_POST_VARS
lub
_POST
zawierają
tablice asocjacyjne
elementów przesłanych do
skryptu przy pomocy metod odpowiednio
GET
i
POST
.
function DisplayGetVars()
{
global $HTTP_GET_VARS;
DisplayArray( $HTTP_GET_VARS );
}
Użycie rysunku jako przycisku
wysłania danych
<input type="image" name="SubmitImg" src="submit.gif">
• oprócz danych do serwera zostaną wysłane dodatkowo
współrzędne x i y (względem lewego górnego rogu
rysunku) punktu gdzie został kliknięty rysunek)
• Nazwy zmiennych przechowujących współrzędne są
tworzone poprzez dodanie
_x
i
_y
do nazwy elementu
reprezentującego rysunek.
• Niektóre przeglądarki posiadają mechanizm pozwalający
wykorzystać klawisz
Enter
zamiast klikania w przycisk na
formularzu. Gdy użyjemy rysunku zamiast przycisku,
mechanizm ten nadal będzie działał, ale
nie zostaną
wtedy przesłane dane na temat współrzędnych
.
Cookie
• Cookie są plikami tekstowymi zapisanymi
na komputerze klienta
• PHP posiada tylko jedna funkcję
przeznaczoną do tworzenia cookie,
setcookie()
int setcookie(
string
nazwa
,
string
wartość
,
int
czas
,
string
ścieżka
,
string
domena
,
int
bezpieczny
)
Cookie
• funkcja setcookie() musi być wywołana przed wysłaniem
jakichkolwiek danych do przeglądarki
• Dowolne cookie odesłane do aplikacji przez
przeglądarkę jest automatycznie konwertowane na
zmienną PHP tak samo, jak dzieje się to w przypadku
metod GET i POST.
• Cookie mogą przenosić wartości skalarne jak również
tablice wartości.
• Wszystkie argumenty funkcji poza nazwą są opcjonalne
• Argument czas jest standardowym czasem z systemu
Unix w postaci liczby, którą można uzyskać jako wynik
funkcji
mktime()
lub
time().
Użycie cookie
<?php
// Sprawdzenie czy istnieje zmienna cookie
$LastTime
if ( !empty( $LastTime ) )
{
$aMessage = "Ostatnia wizyta miała miejsce ";
$aMessage .= date( "d F Y", $LastTime );
$aMessage .= " o ";
$aMessage .= date( "h:i:s a", $LastTime );
}
else
{
$aMessage = "Nie byłeś tu przez ostatnie ";
$aMessage .= "dwa tygodnie.";
}
// Ustawienie cookie ważnego przez dwa tygodnie
$aTwoWeeks = time() + ( 60 * 60 * 24 * 14 );
setcookie( "LastTime", time(), $aTwoWeeks );
// sprawdzenie istnienia niezwykle ważnej tablicy
z cookie
$aValMessage = "";
if ( !empty( $CookieArray ) )
{
$aValMessage = "Wartości: " .
$CookieArray[0];
$aValMessage .= ", " . $CookieArray[1];
$aStartValue = $CookieArray[1] + 1;
}
else
{
$aValMessage = "Wartości nie są dostępne!";
$aStartValue = 0;
}
// usunięcie niezwykle istotnej tablicy wartości
setcookie( "CookieArray[0]" );
setcookie( "CookieArray[1]" );
// dodanie niezwykle istotnej tablicy wartości
setcookie( "CookieArray[0]", $aStartValue,
$aTwoWeeks );
setcookie( "CookieArray[1]", $aStartValue + 1,
$aTwoWeeks );
?>
<html>
<head>
<title>Użycie cookie</title>
</head>
<body>
<?php
print( $aMessage . "<br><br>" . $aValMessage
);
?>
</body>
</html>
Obróbka danych do wyświetlenia
• strip_tags()
• htmlentities()
• strip_slashes()
• nl2br()
<!-- Skrypt safedisplay2.phtml -->
<?php
error_reporting( 255 );
switch ( $FilterType )
{
case 0 : // brak
$aDisplayText = $TheText;
break;
case 1 : // strip_tags
$aDisplayText = strip_tags( $TheText );
break;
case 2 : // htmlentities
$aDisplayText = htmlentities( $TheText
);
break;
}
?>