Projektowanie stron internetowych - PHP


Operacje na plikach

Posted in Uncategorized by admin on the February 15th, 2007

Obsługa plików jest zawarta we wszystkich nowoczesnych językach programowania. Zdolność do tworzenia, czytania, zapisu i innych operacji na plikach lub innych obiektach systemu plików jest niezbędna do zrealizowania obsługi sesji i serializacji. Do obsługi plików i innych obiektów systemu plików PHP posiada funkcje podobne do tych spotykanych w języku C. Tak jak C, w funkcjach służących do odczytu i zapisu, PHP używa uchwytów plików oraz pozwala na tworzenie uchwytów (pozwalających na operacje innymi typami strumieni danych, takimi jak gniazda i potoki). Zdolność ta powoduje, że równie łatwo można zapisać dane do pliku jak również wysłać je poprzez potok do innego programu co bardzo ułatwia projektowanei stron internetowych.

Odczyt i zapis plików 

Jedną z głównych różnic przy projektowaniu stron internetowych w stosunku do zwykłych aplikacji, jest sposób utrzymywania stanu aplikacji. W przypadku zwykłego programu, użytkownik uruchamia go, wykonuje kilka komend i kończy działanie programu. W czasie pracy programu stan aplikacji jest utrzymywany w pamięci. W aplikacjach opartych o sieć WWW stan musi być utrzymywany przez serwer WWW, ponieważ klientem jest zwykle prosta przeglądarka WWW. W chwili obecnej wystarczy wiedzieć, że do utrzymywania stanu aplikacji i tworzenia innych mechanizmów przechowywania danych można użyć plików.

Ważne jest, aby używając plików, pamiętać o zagadnieniach bezpieczeństwa. Ponieważ aplikacja będzie działać w kontekście serwera WWW, pliki będą miały uprawnienia użytkownika przy pomocy którego uruchamiany jest serwer WWW. W przypadku Apache domyślnie jest to użytkownik nobody, którego uprawnienia ograniczają dostęp przez aplikację do obiektów systemu plików. Należy uważać, aby korzystając z plików nie naruszyć systemu bezpieczeństwa serwera WWW. W większości przypadków użycie bazy danych zamiast plików jest o wiele bardziej bezpieczne i praktyczne. Projektowanie stron internetowych korzystajacych z bazy danych wymaga jednak dodatkowo znajomości jezyka SQL. Oczywiście istnieje wiele sytuacji gdy narzut czasowy wprowadzany przez bazę danych lub wymagania aplikacji powodują, że pliki są jedynym sensownym rozwiązaniem.

Na wydruku 4.1 pokazane zostało w jaki sposób można zrealizować liczniki dostępu do stron witryny. Do tego celu wykorzystane zostały podstawowe operacje na plikach, otwarcie, odczyt, zapis i zamknięcie prostego pliku śladu. W przykładzie tym nie zostały wykorzystane wszystkie dostępne w PHP funkcje operujące na plikach. Bardziej szczegółowy opis wszystkich funkcji znajdują się w skorowidzu funkcji na końcu książki.

Wydruk 4.1. Użycie plików do zliczania odwołań do stron witryny

<?php

/*

Plik ten może być dołączany do dowolnego skryptu PHP. Powoduje to automatyczne zliczanie odwołań do strony.

UŻYCIE: Wystarczy dołączyć ten plik. Tworzy on zmienną globalną $aPageAccessCount, która zawiera ilość odwołań do skryptu który dołącza ten plik.

*/

error_reporting( 0 );
$aLogFilePath = “/www/auto_logs/access.log”;
$aCountArray = array();
// Sprawdzenie czy plik istnieje
if ( is_file( $aLogFilePath ) == True )
{
// Otwarcie i odczytanie pliku. Format pliku to oddzielone tabulatorami
// pary opisujące kolejne skrypty:
// ścieżka-do-skryptu licznik
$aFile = fopen( $aLogFilePath, “r” );
while( !feof( $aFile ) )
{
$aLine = fgets( $aFile, 1024 );
$aTempArray = explode( “\t”, $aLine );
if ( count( $aTempArray ) == 2 )
{
$aCountArray[$aTempArray[0]] = $aTempArray[1];
}
}
fclose( $aFile );

}

// Ustawienie globalnego licznika odwołań do strony
// i uaktualnienie tablicy temp
$aPageAccessCount = $aCountArray[$PATH_TRANSLATED] + 1;
$aCountArray[$PATH_TRANSLATED] = $aPageAccessCount;
// Zapis całej tablicy do pliku
$aFile = fopen( $aLogFilePath, “w” );
foreach ( $aCountArray as $aKey => $aValue )
{
fputs( $aFile, “$aKey\t$aValue\n” );
}
fclose( $aFile );

?>

Na wydruku 4.1 pokazujemy użycie jednego pliku do przechowywania liczników odwołań do dowolnej liczby stron witryny. Nie jest to efektywny sposób, ale pokazuje ideę takiego licznika. W skrypcie tym sprawdzamy za pomocą funkcji is_file() czy istnieje plik śladu. Jeżeli plik ten istnieje, jego kolejne linie są odczytywane i analizowane. Każda linia zawiera pełną ścieżkę dostępu do skryptu, znak tabulacji i wartość licznika. Linia taka jest dzielona przy pomocy funkcji explode() na nazwę skryptu i wartość licznika a następnie wartości te są zapisywane w tablicy asocjacyjnej. Jeżeli chcesz, możesz użyć tej tablicy do wyświetlenia liczników dla wszystkich stron witryny a nie tylko bieżącej strony. Po wypełnieniu tablicy uaktualniany jest licznik odwołań do bieżącej strony (rozpoznawanej przy użyciu zmiennej globalnej PHP $PATH_TRANSLATED) i wartość ta jest przypisywana do zmiennej $aPageAccessCount. Na koniec cała tablica jest zapisywana do pliku śladu.

Na wydruku 4.2 pokazane jest strona demonstrująca jak łatwo można użyć tego licznika. Jeżeli szukasz takiego mechanizmu do twojej witryny, należy pamiętać, że jest to bardzo nieefektywne rozwiązanie. Bardziej efektywne jest odczytywanie i zapis tylko jednej wartości a nie całego pliku.

Wydruk 4.2. Użycie skryptu z wydruku 4.1

<?php

include( “auto_counter.php” );

?>

<html>

<head>

<title>Strona testowa 1</title>

</head>

<body>

Strona ta była oglądana <b>

<?php

print( $aPageAccessCount );

?>

</b> razy.

</body>

</html>

Comments Off

Cookies a projektowanie stron internetowcyh

Posted in Uncategorized by admin on the February 15th, 2007

Z powodu trwającej debaty na temat użycia cookie, większość programistów stron internetowych i użytkowników jest zaznajomiona z koncepcją cookie. Cookie są plikami tekstowymi zapisanymi na komputerze klienta i są one ze swojej natury niewinne. Jednak wielu użytkowników nie przyjmuje cookie wysłanych do przeglądarek z powodu plotek na temat ich wykorzystania. Jeżeli twoja aplikacja opiera swoje działanie na cookie, niektórzy użytkownicy nie będą mogli jej używać. Jak wiadomo projektowanie stron internetowych często wymaga kompromisów.  Jednak jeżeli korzystasz z cookie, ale nie wymagasz ich do prawidłowej pracy, twoja aplikacja będzie działała z większością przeglądarek.

PHP posiada tylko jedna funkcję przeznaczoną do tworzenia cookie, setcookie(). Ponieważ cookie są wysyłane jako część nagłówka HTTP, funkcja setcookie() musi być wywołana przed wysłaniem jakichkolwiek danych do przeglądarki lub należy zastosować buforowanie wyjścia w celu opóźnienia wysyłania danych do przeglądarki do chwili zdefiniowania wszystkich cookie. To samo ograniczenie obowiązuje również dla funkcji header().

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. Funkcja setcookie() jest zdefiniowana w sposób następujący:

int setcookie( string nazwa, string wartość, int czas, string ścieżka, string domena, int bezpieczny )

Wszystkie argumenty funkcji poza nazwą są opcjonalne. Jeżeli funkcja jest wywołana tylko z nazwą, cookie o podanej nazwie jest usuwane. Dowolny z ciągów może zostać opuszczony podając pusty ciąg (“”). Dowolna wartość numeryczna może zostać opuszczona podając wartość zero. Argument czas jest standardowym czasem z systemu Unix w postaci liczby, którą można uzyskać jako wynik funkcji mktime() lub time(). Parametr bezpieczny wskazuje, że cookie może być przesyłane jedynie przez połączenie bezpieczne (HTTPS).

Należy pamiętać o następujących pułapkach i częstych błędach użycia cookie:

  • Ustawione cookie nie będą widoczne w skrypcie do czasu jego powtórnego załadowania.
  • Przeglądarki różnie obsługują cookie. Sprawdź aplikację na możliwie dużej ilości przeglądarek.
  • Każda przeglądarka przechowuje cookie niezależnie. Oznacza to, że jeżeli użytkownik obejrzy witrynę przy użyciu jednej przeglądarki i zostanie ustawione cookie, to cookie nie będzie dostępne, jeżeli użytkownik ponownie obejrzy witrynę za pomocą innej przeglądarki.

Więcej ogólnych informacji na temat cookie można znaleźć w specyfikacji cookie firmy Netscape, która jest dostępna pod adresem http://www.netscape.com/newsref/std/cookie_spec.html.

W poprzedniej wersji PHP jeżeli chciałeś ustawić wiele cookie za pomocą jednego skryptu, musiałeś wywoływać setcookie() w odwrotnej kolejności do tej, w jakiej chciałeś obsługiwać cookie. Na przykład, jeżeli chciałeś usunąć cookie a następnie ustawić nowe o tej samej nazwie, należało najpierw wywołać setcookie(), aby ustawić nową wartość a następnie usunąć poprzednią wartość. W PHP4 zostało to usunięte i dzięki temu projektowanie stron internetowych wykorzystujacych cookie jest łatwiejsze. Należy wywoływać setcookie() w takiej kolejności jak się spodziewasz, że będą przetwarzane przez przeglądarkę.


Comments Off

Typy danych

Posted in Uncategorized by admin on the February 15th, 2007

PHP posiada następujące typy: liczby zmiennoprzecinkowe, liczby całkowite, ciągi, tablice i obiekty. Typ zmiennej jest ustalany w oparciu o kontekst w jakim jest użyta zmienna i nie jest on jawnie ustalany przez programistę. Jest to ważna cecha o której należy pamiętać podczas programowania aplikacji PHP, ponieważ niejawna konwersja typów może spowodować trudne do odnalezienia błędy. Na przykład poniższa instrukcja jest prawidłowa i spowoduje wyświetlenie liczby 9:

print( 3* “3 małe świnki”);

Aby można było zapanować nad typami, PHP posiada funkcje gettype() i settype() oraz kilka funkcji przeznaczonych dla określonych typów, na przykład is_integer() lub is_array(). W skorowidzu funkcji na końcu książki znajduje się pełne omówienie tych funkcji. Teraz zostanie opisany każdy z typów zmiennych (oprócz obiektów). Obiekty PHP zostaną opisane w dalszej części rozdziału.

Liczby — całkowite i zmiennoprzecinkowe

Liczby całkowite można podawać używając notacji dziesiętnej, ósemkowej i szesnastkowej. Liczby zmiennoprzecinkowe można podawać używając notacji zwykłej lub zapisu naukowego. Na poniższym wydruku pokazana jest składnia PHP dla wszystkich tych notacji.

Wydruk 2.4. Reprezentacja liczb

<?php

  $int1 = 523;  // liczba dziesiętna

  $int2 = -523;  // dziesiętna ujemna

  $int3 = 01013;  // ósemkowa reprezentacja liczby 523

  $int4 = 0×20B;  // 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 (). Zapisy te różnią się sposobem interpretacji ciągu. Jeżeli ciąg jest otoczony cudzysłowami, zmienne zapisane w ciągu zostają zamienione na ich wartości. Aby zapisać znaki specjalne w ciągach otoczonych cudzysłowami, należy użyć znaku lewego ukośnika (\), tak jak zostało to pokazane w tabeli 2.1.

Tabela 2.1. Znaki specjalne w ciągach otoczonych cudzysłowami

Sekwencja znaków

Znaczenie

\n

nowa linia

\r

powrót karetki (CR)

\t

tabulacja

\\

lewy ukośnik

\”

cudzysłów

\$

znak dolara

W ciągach otoczonych apostrofami zmienne nie są zastępowane. Jedynymi dopuszczalnymi sekwencjami sterującymi są te oznaczające lewy ukośnik (\\) i apostrof (\’). Sekwencje te pozwalają na wpisanie do ciągu znaku apostrofu i lewego ukośnika. Ciągi mogą być łączone przy użyciu operatora kropki (.). Dokładniej jest to opisane w części rozdziału na temat operatorów. Podobnie jak w języku C, mamy dostęp do poszczególnych znaków ciągu, traktując go jak tablicę znaków.

Wydruk 2.5. Przykład operacji na ciągach

<?php

  $aStr1 = “To jest zwykły ciąg.”;

  print( “$aStr1<br>” );

  $aStr2 = “Thatcher”;

  print( “$aStr2<br>” );

  $aStr3 = “Nazywam się $aStr2″;

        // $aStr3 = “Nazywam się Thatcher”

  print( “$aStr3<br>” );

  $aStr4 = “Nazywam się \$aStr2″;

        // $aStr4 = “Nazywam się $aStr2″

  print( “$aStr4<br>” );

  $aStr5 = ‘Nie rozwijaj \’$aStr2\”;

        // $aStr5 = “Nie rozwijaj ‘$aStr2′”

  print( “$aStr5<br>” );

      // wypisuje “Nazywam się Thatcher i Nazywam się $aStr2″

  print( “$aStr3″ . ” i ” . “$aStr4″ );

?>

Z powodu ulotnej natury typów w PHP, zmienne mogą zmieniać swój typ w zależności od kontekstu w jakim występują. Liczby mogą być konwertowane niejawnie na ciągi, jeżeli zostaną użyte jako argument operatora operującego na ciągach. Ciągi mogą również zostać skonwertowane na liczby, jeżeli będą użyte w wyrażeniach matematycznych. Jeżeli PHP próbuje skonwertować ciąg na liczbę, korzysta z następujących zasad:

  • 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ą.

Prawidłowymi danymi numerycznymi są: opcjonalny znak po którym następuje jedna lub więcej cyfr, opcjonalna kropka dziesiętna oraz opcjonalny znak wykładnika. Znakiem wykładnika jest „e” lub „E”, po którym następuje jedna lub więcej liczb.

Wydruk 2.6. Niejawna konwersja pomiędzy ciągiem i liczbą

<?php

  $aVar = 123;

  print( “\$aVar = $aVar, typ = ” . gettype( $aVar ) . “<br>” );

 

  $aVar2 = $aVar . ” niejawnie skonwertowane do ciągu”;

  print( “\$aVar2 = $aVar2, typ = ” . gettype( $aVar2 ) . “<br>” );

 

  $aVar3 = $aVar2 + 1;  // niejawna konwersja na liczbę całkowitą

  print( “\$aVar3 = $aVar3, typ = ” . gettype( $aVar3 ) . “<br>” );

 

  $aVar3 = $aVar2 * 1.1;  // niejawna konwersja na liczbę zmiennoprzecinkową

  print( “\$aVar3 = $aVar3, typ = ” . gettype( $aVar3 ) . “<br>” );

 

  $aNotNumber = “abc”;

  $aVar4 = $aNotNumber * 1; // próba konwersji na liczbę, zwracane jest 0

  print( “\$aVar4 = $aVar4, typ = ” . gettype( $aVar4 ) . “<br>” );

 

  $aIsNumber = “3 małe świnki”;

  $aVar5 = $aIsNumber + 1; // konwersja $aIsNumber na liczbę 3

  print( “\$aVar5 = $aVar5, typ = ” . gettype( $aVar5 ) . “<br>” );

?>

Tablice

Tablice w PHP zachowują się zarówno tak jak tablice indeksowane (wektory) oraz jak tablice mieszające (asocjacyjne). PHP pozwala również na tworzenie tablic wielowymiarowych. Z powodu unikalnej konstrukcji tablic w PHP, można indeksować jeden wymiar tablicy wielowymiarowej liczbami a inny w sposób asocjacyjny.

Tablice mogą być tworzone przy użyciu funkcji list() lub array() albo poprzez jawne podanie każdej z wartości. W skorowidzu funkcji na końcu książki zostały opisane wszystkie funkcje do manipulacji tablicami.

Jednowymiarowe tablice mogą zamieniane w ciągach przez mechanizm zastępowania zmiennych na wartości w sposób identyczny jak wszystkie inne zmienne. W przypadku tablic wielowymiarowych należy użyć nawiasów klamrowych do zaznaczenia indeksów. Poniższy wydruk pokazuje przykłady użycia różnych typów tablic.

Wydruk 2.7. Inicjowanie i użycie tablic

<?php

  // Jawne tworzenie prostej tablicy

  $a[0] = “Ryan”;

  $a[1] = “Scott”;

  $a[] = “Randall”; // jawne przypisanie do indeksu (klucza) 2

  $a[] = “Sherie”;  // jawne przypisanie do indeksu (klucza) 3

  print( “$a[3], $a[2], $a[1], $a[0]<br>” );

 

  // Tworzenie tablicy asocjacyjnej

  $color[”niebieski”] = “#0000FF”;

  $color[”zielony”] = “#00FF00″;

  $color[”czerwony”] = “#FF0000″;

  print( “Wartość szesnastkowa koloru czerwonego wynosi {$color[’czerwony’]}<br>” );

 

  // Tworzenie tej samej co poprzedniej tablicy asocjacyjnej

  // tylko nieco prościej

  $color = array( “niebieski”  =>  “#0000FF”,

          “zielony”  =>  “#00FF00″,

          “czerwony”  =>  “#FF0000″ );

  print( “Wartość szesnastkowa koloru zielonego wynosi {$color[’zielony’]}<br>” );

 

  // Ręczne tworzenie tablicy wielowymiarowej

  $m[0][0] = “Zero Zero”;

  $m[0][1] = “Zero Jeden”;

  print( “Wartością \$m[0][1] jest {$m[0][1]}<br>” );

 

  // Ręczne tworzenie asocjacyjnej tablicy wielowymiarowej

  $counties[”Idaho”][0] = “Ada”;

  $counties[”Idaho“][1] = “Adams“;

  $counties[”Idaho“][2] = “Bannock”;

  $counties[”Arizona“][0] = “Apache”;

  $counties[”Arizona“][1] = “Cochise”;

  $counties[”Arizona“][2] = “Coconino”;

  print( “\$counties[’Idaho‘][0] = {$counties[’Idaho‘][0]}<br>” );

?>

Comments Off

Ogólne informacje na temat składni

Posted in Uncategorized by admin on the February 15th, 2007

Ponieważ PHP jest zwykle wbudowywany w kod HTML istnieją specjalne znaczniki ograniczające bloki PHP. Użycie tych znaczników jest nazywane czasem wyjściem z trybu HTML.

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>”; %>

Pierwsza metoda oznaczania bloków PHP jest dostępna jedynie wtedy, gdy uaktywnione są krótkie znaczniki. Aby to zrobić należy użyć funkcji short_tags(), włączyć w pliku konfiguracyjnym opcję short_tag_open lub skompilować PHP z opcją -enable-short-tags. Znaczniki w stylu ASP są dostępne jedynie wtedy, gdy uaktywniona jest opcja konfiguracji asp_tags.

PHP jest syntaktycznie bardzo podobny do C. Na przykład, instrukcje są oddzielone średnikiem. Znacznik ?> jest niejawnym końcem instrukcji, więc poniższe przykłady są poprawne składniowo:

Wydruk 2.2. Koniec instrukcji

<?php

echo “Test, test…<br>”;

?>

<?php

echo “Test, test…<br>”

?>

Komentarze w PHP można oznaczać symbolami komentarzy pochodzącymi z C, C++ lub stosowanych w skryptach Uniksa. Komentarze jednoliniowe komentują tekst do końca linii lub do końca bieżącego bloku PHP w zależności od tego, co będzie pierwsze. Nie można zagłębiać wielowierszowych komentarzy w stylu C.

Wydruk 2.3. Komentarze

<?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 */

*/

?>

Comments Off
Next Page »