Wyższa Szkoła Technologii Teleinformatycznych w Świdnicy Internetowe bazy danych wykład 7 dr inż. Jacek Mazurkiewicz e-mail: Jacek.Mazurkiewicz@pwr.wroc.pl
Sesje i stan aplikacji w kategorii czasu okres jaki użytkownik spędza w witrynie rodzaj wielkiego obiektu zawierający zmienne i wartości sesja ma łańcuch identyfikujący ID łańcuch identyfikujący przesyłany do użytkownika w pakiecie cookie z nazwą PHPSESSID jak sesja inicjowana po stronie serwera powstaje odpowiadający sesji tymczasowy plik o tej samej nazwie co łańcuch identyfikujący tymczasowy plik przechowuje zarejestrowane zmienne sesji i ich wartości przeglądarka wysyła ID do serwera razem z każdym żądaniem przesłania strony serwer wykorzystuje ID do odczytania i odtworzenia wszystkich potrzebnych danych aplikacji po zakończeniu aplikacji dane są usuwane z serwera
Rozpoczynanie sesji i użycie zmiennych sesji
Zawartość pliku tymczasowego count s:7: 76 ; valid s:7: yes count i valid to nazwy zarejestrowanych zmiennych mechanizm wydobycia zmiennej sesji parser PHP pobiera wartość $PHPSESSID z cookie znajduje odpowiedni plik tymczasowy sesji wewnątrz pliku parser wyszukuje zmienną i jej wartość zmienna o określonej nazwie i wartości jest dostępna
Rozpoczęcie pracy z sesjami w PHP rozpoczęcie sesji za pomocą session_start() zarejestrowanie nazw zmiennych sesji za pomocą session_register() użycie zmiennych sesji można zmienić sposób przesyłania identyfikatora sesji można zmienić miejsce przechowywania zmiennych sesji na serwerze można zmieniać częstotliwość usuwania przerwanych sesji
Uruchamianie sesji i inicjowanie zmiennych session_start(); session_register( "auser", "aaccount" ); $auser = "Cidnie"; $aaccount = "1016"; <html> <head> <title>podstawy sesji: Strona 1</title> </head> <body> print( "Użytkownik: $auser<br>" ); print( "Konto: $aaccount<br>" ); <a href="listing2.phtml">przejście do strony 2</a> </body> </html>
Użycie zmiennych sesji (1) session_start(); <html> <head> <title>podstawy sesji: Strona 2</title> </head> <body> print( "Użytkownik: $auser<br>" ); print( "Konto: $aaccount<br>" ); </body> </html> uruchomienie sesji poprzez wywołanie funkcji session_start() PHP używa cookie do przechowywania identyfikatora sesji funkcje muszą być wywoływane przed wysłaniem do przeglądarki jakichkolwiek informacji
Użycie zmiennych sesji (2) po rozpoczęciu sesji, zostają zarejestrowane dwie zmienne, auser oraz aaccount po kliknięciu łącza prowadzącego do strony 2, przeglądarka samoczynnie wyśle identyfikator sesji do serwera sesji w trakcie wywołania funkcji session_start(), PHP korzysta z identyfikatora sesji do odczytania wszystkich zmiennych sesji
Przesyłanie identyfikatora sesji bez użycia cookie (1) ręczne - w postaci zmiennej GET lub POST session_start(); session_register( "auser", "aaccount" ); $auser = "Cidnie"; $aaccount = "1016"; <html> <head> <title>ręczne przesyłanie identyfikatora sesji Strona 1</title> </head> <body> print( "Użytkownik: $auser<br>" ); print( "Konto: $aaccount<br>" ); <a href="listing2.phtml?<?=sid">przejście do strony 2</a> </html>
Przesyłanie identyfikatora sesji bez użycia cookie (2) do adresu URL została doklejona stała PHP SID stała ta jest zdefiniowana jako: SessionName=SessionID poniższy kod jest semantycznie identyczny z linią z wydruku: <a href="listing2.phtml? echo session_name()."=".session_id()"> Przejście do strony 2</a> SID to stała a nie zmienna, druk $SID zamiast SID, nie daje takiego samego wyniku skrót <?=SID jest równoważny z echo SID; każde łącze i każdy formularz w aplikacji musi zawierać identyfikator sesji brak identyfikatora w jednym łączu - SID utracony, a aplikacja będzie źle działać
Przesyłanie identyfikatora sesji bez użycia cookie (3) opcja PHP automatycznego przekształcania łączy - przesyłanie identyfikatora sesji przy użyciu metod GET i POST uaktywnienie kompilacja PHP z opcją --enable-trans-sid session_start(); session_register( "auser", "aaccount" ); $auser = "Cidnie"; $aaccount = "1016"; <html> <head> <title>automatyczne przesyłanie identyfikatora sesji: Page 1</title> </head> <body> print( "Użytkownik: $auser<br>" ); print( "Konto: $aaccount<br>" ); <a href="listing2.phtml">przejście do strony 2</a> </html>
Przesyłanie identyfikatora sesji bez użycia cookie (4) nie ma odwołania do stałej SID w łączu Identyczny jak 1, ale gdy się kliknie łącze, URL będzie zawierał ciąg PHPSESSID=xxx, tak samo jak w przypadku skryptu 3 PHP szuka na stronie względnych adresów URL i dodaje do nich potrzebną wartość identyfikatora sesji następny skrypt zawiera kilka względnych łączy i kilka bezwzględnych zobaczymy w jaki sposób PHP przetworzył łącza
session_start(); session_register( "auser", "aaccount" ); $auser = "Cidnie"; $aaccount = "1016"; <html> <head> <title>uzupełnianie adresów URL</title> </head> <body> print( "Użytkownik: $auser<br>" ); print( "Konto: $aaccount<br>" ); <a href="listing2.phtml">łącze 1</a> <a href="listing2.phtml?myvar=1234">łącze 2</a> <a href="http://www.php.net/">łącze 3</a> <a href="http://localhost/listing2.phtml">łącze 4</a> <form action="listing2.phtml"> <input type="submit" name="submit" value="przycisk przesłania danych formularza"> </form> </html>>
do przeglądarki został wysłany następujący kod HTML <html><head> <title>uzupełnianie adresów URL</title> </head><body> Użytkownik: Cidnie<br>Konto: 1016<br> <a href="listing2.phtml?phpsessid=9771f86dc94e367cf1c62e0339d02c4b > Łącze 1</a> <a href="listing2.phtml?myvar=1234& PHPSESSID=9771f86dc94e367cf1c62e0339d02c4b"> Łącze 2</a> <a href="http://www.php.net/">łącze 3</a> <a href="http://localhost/listing2.phtml">łącze 4</a> <form action="listing2.phtml"><input TYPE="HIDDEN" NAME="PHPSESSID" VALUE="9771f86dc94e367cf1c62e0339d02c4b"> <input type="submit" name="submit" value="przycisk przesłania danych formularza"> </form></html>
Usuwanie zmiennej sesji, całej sesji session_unregister( zmienna_sesji ); session_destroy(); pierwsze dwa łącza są względne - zostały do nich dołączone dane na temat sesji łącze 3 nie jest oczywiście łączem względnym, więc identyfikator sesji nie został dołączony łącze 4 - bezwzględny adres URL, chociaż strona ta znajduje się na tym samym serwerze. PHP uzupełnia jedynie adresy URL zapisane w postaci łączy względnych PHP potrafi również uzupełniać formularz tak, aby zawierał on wartość identyfikatora sesji - wada - działa jedynie dla metody POST.
Konfiguracja kontroli sesji plik php.ini opcja domyślnie wynik session.auto_start 0 automatyczny start sesji session.cache_expire 180 czas pamiętania sesji w minutach session.cookie_domain brak domena w cookie sesji session.cookie_path / ścieżka w cookie sesji session.name PHPSESSID nazwa sesji - cookie session.save_handler files przechowywanie danych sesji session.save_path /tmp miejsce przechowywania danych session.use_cookie 1 włączenie cookie
Uwierzytelnianie w kontroli sesji (1) echo <form method=post action=\ uwierz_gl.php\ > ; echo <table> ; echo <tr><td>identyfikator użytkownika:</td> ; echo <td><input type=text name=iduzytkownia></td></tr> ; echo <tr><td>hasło:</td> ; echo <td><input type=password name=haslo></td></tr> ; echo <tr><td colspan=2 align=center> ; echo <input type=submit value=\ Logowanie\ ></td></tr> ; echo </table></form> ; if($iduzytkownika && $haslo) { $bd_lacz=mysql_connect( localhost, login, pass ); mysql_select_db( uwierz,$bd_lacz); $pyt= select * from uwierz where uzytkownik like $iduzytkownika and haslo like $haslo ; $wynik=mysql_query($pyt, $bd_lacz);
Uwierzytelnianie w kontroli sesji (2) if(mysql_num_rows($wynik)>0) { $user_ok=$iduzytkownika; session_register( user_ok ); } if(session_is_registered( user_ok )) { echo Użytkownik zalogowany jako: $user_ok <br> ; echo <a href=\ wylog.php\ >Wylogowanie</a><br> ; } if(isset($idużytkownika)) { echo Zalogowanie niemożliwe ; }
Uwierzytelnianie w kontroli sesji (3) session_start(); echo <h1>część tajna</h1> ; if(session_is_registered( user_ok )) { echo <p>użytkownik zalogowany jako $user_ok.</p> ; echo <p>oto zawartość tajna</p> } else { echo <p>użytkownik niezalogowany</p> ; } echo <a href=\ uwierz_gl.php\ >Powrót do strony głównej</a> ;
Uwierzytelnianie w kontroli sesji (4) session_start(); $old_user=$user_ok; $wynik=session_unregister( user_ok ); session_destroy(); <html> <body> <h1>wylogowanie</h1> if(!empty($old_user)) { if($wynik) echo Wylogowano.<br> ; else echo Wylogowanie niemożliwe.<br> ; } else {echo Brak logowania, brak wylogowania.<br> ;}
Ponowne zastosowanie kodu (1) require załadowanie pliku do skryptu PHP // kod w pliku again.php echo Wyrażenie PHP.<BR> ; // kod w pliku main.php echo Plik główny.<br> ; require( again.php ); echo Koniec skryptu ; - ładowany plik może zawierać wszystko, co można umieścić w skrypcie: wyrażenia PHP, tekst, znaczniki HTML, funkcje PHP - PHP nie zwraca uwagi na rozszerzenie żądanego pliku - nazwy mogą być dowolne pod warunkiem, że nie będzie on wywoływany samodzielnie - wyrażenia PHP wykonają się prawidłowo nawet wówczas gdy plik otrzyma rozszerzenie, które nie jest związane z PHP - uwaga na konspirację jeśli rozszerzenia będą złe obcy może podejrzeć zawartość wnętrza PHP-owego
Ponowne zastosowanie kodu (2) include załadowanie pliku do skryptu PHP if($zm == true) { require( pl1.inc ); } else { require( pl2.inc ); } if($zm == true) { include( pl1.inc ); } else { include( pl2.inc ); } jeśli serwer słabo obciążony wszystko jedno który mechanizm stosujemy pliki ładowane przez include mogą zwrócić wartość, przez require - nie zmienne można tworzyć zarówno w pliku głównym, jak i dołączanych - będą widoczne wszędzie tak z require, jak i z include przewaga require nad include działa szybciej!
przykład include zwracającego wartość // kod w pliku otplik.php $wp = @fopen($nazwa, $tryb); if (!wp) { echo <p><strong>otwarcie niemożliwe.</strong></p> return 0; } else { return 1; } // kod w pliku main.php $nazwa = plik.txt ; $tryb = r ; $wynik = include( otplik.php ); if($wynik == 1) { // operacje z plikiem, dostępny wskaźnik $wp }