Technologie internetowe II Wykład 3 – Formularze, poczta, pliki Dr Krzysztof Heller
Technologie internetowe II Literatura Meloni J.C.: PHP, MySQL i Apache dla każdego. Wydanie III, Helion, 2007 Lis M.: PHP i MySQL dla każdego, Helion, 2005 Leszek 'leon' Krupiński: Wykłady internetowe, 2007 http://docs.wsei.pl/dydaktyka/Techn_Internet_II_wyklad3.ppt 21-11-2009 Technologie internetowe II
Technologie internetowe II Plan wykładu 3 Formularze. Tworzenie formularza, łączenie kodu HTML i PHP, zapisywanie stanu, przekierowania. Wysyłanie poczty elektronicznej, przesyłanie plików. 21-11-2009 Technologie internetowe II
Pobieranie danych
Technologie internetowe II Pobieranie danych Jedyna metoda - pobranie ze standardowego formularza HTML. W PHP wszystkie dane z formularza trafiają do odpowiednich tablic asocjacyjnych o nazwach kluczy takich, jak nazwy pól formularza. Jeśli w konfiguracji PHP opcja register_globals jest włączona to stworzone zostaną od razu zmienne o nazwach takich jak nazwy pól formularza. Są dwie metody przekazywania parametrów do innych stron: metoda "GET" metoda "POST" 21-11-2009 Technologie internetowe II
Technologie internetowe II Metoda GET Używana gdy jest niewiele parametrów. Parametry przekazuje się za pomocą adresu URL którego długość jest ograniczona. Parametry są widoczne w pasku adresu przeglądarki. Adres od parametrów oddzielany jest za pomocą znaku zapytania, a kolejne pary parametr=wartość za pomocą znaku ampersand ("&"). Dane przesłane metodą GET trafiają do tablicy $_GET. 21-11-2009 Technologie internetowe II
Technologie internetowe II Metoda POST Do przekazywania parametrów wykorzystuje nagłówek zapytania. Metoda ta umożliwia przekazywanie dużo większych parametrów. Parametrów nie widać w pasku przeglądarki. Dane przesłane metodą POST trafiają do tablicy do tablicy $_POST . Tablice $_GET i $_POST są superglobalne. Istnieje jeszcze superglobalna tablica $_REQUEST, która łączy w sobie tablice $_GET, $_POST, $_COOKIE i $_FILES. 21-11-2009 Technologie internetowe II
Technologie internetowe II Przykład – raz.php <html> <head> <title>Test formularza</title> </head> <body> <form action="dwa.php" method="GET"> Imię: <input type=text name="imie"/><br/> Nazwisko: <input type=text name="nazwisko"/><br/> Proszę o fakturę do zamówienia: <input type=checkbox name="faktura"/><br/> Chcę zamówić:<br/> <input type=radio name=zamow value="kola"/>Coca-colę<br> <input type=radio name=zamow value="fanta"/>Fantę<br> <input type=radio name=zamow value="sprite"/>Sprite'a<br> <input type=submit value="Wyślij"/> </form> </body> </html> 21-11-2009 Technologie internetowe II
Technologie internetowe II dwa.php <html> <head> <title>Wyniki</title> </head> <body> Imię: <?php echo $_GET['imie']?><br> Nazwisko: <?php echo $_GET['nazwisko']?><br> Faktura: <?php echo ($_GET['faktura'] == 'on' ? 'Tak' : 'Nie')?><br> Zamówienie: <?php switch($_GET['zamow']) { case "kola": echo "Coca-cola"; break; case "fanta": echo "Fanta"; break; case "sprite": echo "Sprite"; break; } ?> </body> </html> 21-11-2009 Technologie internetowe II
Formularze
Prosty formularz <html> <head> <title>Prosty formularz HTML</title> <meta http-equiv=content-type content="text/html;charset=iso-8859-2"> </head> <body> <form action="wyslij_prostyform.php" method="POST"> <p><strong>Imię i nazwisko:</strong><br> <input type="text" name="uzytkownik"> </p><p><strong>Wiadomość:</strong><br> <textarea name="wiadomosc" rows="5" cols="40"></textarea></p><p> <input type="submit" value="Wyślij"></p> </form> </body> </html> Metoda wysyłania formularza: POST, zmienna $_POST Pole tekstowe „uzytkownik” Pole tekstowe „wiadomosc” Przycisk wysyłający formularz 21-11-2009 Technologie internetowe II
wyslij_prostyform.php <?php Metoda wysyłania formularza: POST, zmienna $_POST <?php echo "<p>Witaj <b>$_POST["uzytkownik"]</b>!</p>"; echo "<p>Twoja wiadomość to:<br/><b>$_POST["wiadomosc"]</b></p>"; ?> Metoda wysyłania formularza: POST, zmienna $_POST 21-11-2009 Technologie internetowe II
Technologie internetowe II Wynik 21-11-2009 Technologie internetowe II
Technologie internetowe II Działanie Skrypt zostanie wywołany gdy użytkownik wyśle formularz Zmienne: $_POST["uzytkownik"] oraz $_POST["wiadomosc"] zawierają wartość wpisaną przez użytkownika Formularze można także wysłać przy pomocy metody GET POST potrafi obsłużyć większe ilości danych POST nie wyświetla przesyłanych informacji w pasku adresu przeglądarki Metoda GET używa tablicy $_GET 21-11-2009 Technologie internetowe II
Przekazywanie informacji w tablicach
Przekazywanie informacji Pobieranie informacji z pól formularza posiadających tylko jedną wartość (pola tekstowe, obszary tekstu, przełączniki) jest proste. Są pola (np. SELECT) mogące przyjmować wiele wartości. Składnia – nawiasy kwadratowe na końcu nazwy. 21-11-2009 Technologie internetowe II
Formularz zawierający SELECT <html> <head> <title>Formularz HTML zawieraj±cy element SELECT</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"> </head> <body> <form action="wyslij_selectform.php" method="POST"> <p><strong>Imię i nazwisko:</strong><br/> <input type="text" name="uzytkownik"/> <p><strong>Wybierz produkty:</strong> <br/> <select name="produkty[]" multiple="multiple"> <option value=„Śrubokręt">¦rubokręt</option> <option value="Tricoder">Tricoder</option> <option value="ORAC AI">ORAC AI</option> <option value="HAL 2000">HAL 2000</option> </select> <p><input type="submit" value="Wyślij"></p> </form> </body> </html> Elementy wybrane tutaj są dostępne w tablicy $_POST[„produkty”] Argument „multiple” – uzytkownik może wybrać dowolną liczbę opcji 21-11-2009 Technologie internetowe II
wyslij_selectform.php <?php Odwołanie do wartości zmiennej $_POST <?php echo "<p>Witaj <b>$_POST[uzytkownik]</b>!</p>"; echo "<p>Wybrałeś następujące produkty:<br>"; if (!empty($_POST['produkty'])) { echo "<ul>"; foreach ($_POST['produkty'] as $wartosc) { echo "<li>$wartosc</li>"; } echo "</ul>"; ?> Jeżeli zmienna $_POST nie jest pusta Przechodzimy przez nią wyświetlając każdy element. W tablicy są wartości atrybutu value elementów OPTION, odpowiadające zaznaczonym opcjom. 21-11-2009 Technologie internetowe II
Technologie internetowe II Wynik 21-11-2009 Technologie internetowe II
Technologie internetowe II Działanie Technika szczególnie wygodna dla pól typu SELECT Można używać także dla innych elementów Gdy nazwa pola kończy się nawiasem kwadratowym silnik PHP łączy wszystkie wartości o tej samej nazwie w jedną tablicę Przykład: <input type= ”checkbox” name= ”produkty[]” value= ”Śrubokręt”/>Śrubokręt<br/> <input type= ”checkbox” name= ”produkty[]” value= ”Tricorder”/>Tricorder<br/> <input type= ”checkbox” name= ”produkty[]” value= ”ORAC AI”/>ORAC AI<br/> <input type= ”checkbox” name= ”produkty[]” value= ”HAL 2000”/>HAL 2000<br/> Wybrane wartości będą dostępne w tablicy $_POST[„produkty”] 21-11-2009 Technologie internetowe II
Łączenie kodu HTML i PHP
Łączenie kodu PHP i HTML Czasem jest wygodniej mieć dwa rodzaje kodu w jednym pliku – łatwiej jest wyświetlić ten sam formularz ponownie. Można wyświetlić cały formularz z kodu PHP (funkcja echo). Łatwiej jest umieścić kod HTML w skrypcie PHP. 21-11-2009 Technologie internetowe II
Zgadywanie liczby <?php $liczba_do_odgadniecia = 42; Ustawiamy wartość liczby do odgadnięcia <?php $liczba_do_odgadniecia = 42; if (!isset($_POST['liczba'])) { $komunikat = "Witaj w maszynie zgadującej!"; } else if ($_POST['liczba'] > $liczba_do_odgadniecia) { $komunikat = "Liczba $_POST[liczba] jest zbyt duża, spróbuj mniejszej."; } else if ($_POST['liczba'] < $liczba_do_odgadniecia) { $komunikat = "Liczba $_POST[liczba] jest zbyt mała, spróbuj większej."; } else { // poprawna odpowiedź $komunikat = "Gratulacje!"; ?> Jeżeli formularz nie był wysłany to zaczynamy, inaczej kontynuacja 21-11-2009 Technologie internetowe II
Zgadywanie liczby (c.d.) <html> <head> <title>Skrypt zgadujący</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"> </head> <body> <h1><?php echo $komunikat; ?></h1> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <p><strong>Wybierz liczbę:</strong> <input type="text" name="liczba"> </p><p><input type="submit" value="Wyślij"></p> </form> </body> </html> Ścieżka do aktualnie wykonywanego skryptu 21-11-2009 Technologie internetowe II
Ukryte pole – informacja o stanie
Zapisywanie informacji o stanie Poprzedni kod nie pozwala stwierdzić, ile razy próbowano zgadnąć liczbę. Można zastosować pole ukryte. Działa jak pole tekstowe, ale jest niewidoczne dla użytkownika. Poprawiamy skrypt zgadujący. 21-11-2009 Technologie internetowe II
Zgadywanie liczby 2 Ukryte pole w tym wierszu <?php $liczba_do_odgadniecia = 42; $liczba_prob = (isset($_POST['liczba_prob'])) ? $_POST['liczba_prob'] + 1 : 1; if (!isset($_POST['liczba'])) { $komunikat = "Witaj w maszynie zgadującej!"; } else if ($_POST['liczba'] > $liczba_do_odgadniecia) { $komunikat = "Liczba $_POST[liczba] jest zbyt duża, spróbuj mniejszej."; } else if ($_POST['liczba'] < $liczba_do_odgadniecia) { $komunikat = "Liczba $_POST[liczba] jest zbyt mała, spróbuj większej."; } else { // poprawna odpowiedź $komunikat = "Gratulacje!";} $liczba = $_POST['liczba'];?> <html><head> <title>Zachowywanie stanu w ukrytym polu</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"> </head><body> <h1><?php echo $komunikat ?></h1> <p><strong>Numer próby:</strong> <?php echo $liczba_prob; ?></p> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <p><strong>Wybierz liczbę:</strong> <input type="text" name="liczba" value="<?php echo $liczba; ?>"> <input type="hidden" name="liczba_prob" value="<?php echo $liczba_prob; ?>"> <p><input type="submit" value="Wyślij"></p> </form></body></html> Ukryte pole w tym wierszu 21-11-2009 Technologie internetowe II
Technologie internetowe II Mechanizm sesji Mechanizm sesji umożliwia przekazywanie parametrów między stronami w łatwy sposób. Zmienne są przechowywane po stronie serwera a u klienta trzymane jest tylko ID sesji. ID jest zapisane w cookie lub przekazywane przez URL. PHP umie rozpoznać czy na komputerze klienta włączony jest mechanizm cookies i w razie potrzeby dodać identyfikator sesji do każdego URLu i formularza (opcja --enable-trans-sid). Przed rozpoczęciem sesji do przeglądarki nie mogą być wysłane żadne inne dane. Po otrzymaniu żądania klienta PHP automatycznie (jeśli w konfiguracji PHP włączona została opcja auto_start) lub "ręcznie" przez programistę (za pomocą funkcji session_start()) sprawdza, czy przypisano już ID sesji. J Tak - PHP odczytuje zmienne zarejestrowane w tej sesji. Nie - generowany jest nowy, unikalny identyfikator sesji. Aby PHP zaczęło śledzić wartość zmiennej, najpierw trzeba ją zarejestrować za pomocą funkcji session_register(nazwa_zmiennej). Istnieje też odwrotna wersja tej funkcji. Zmienna $_SESSION, przechowuje zmienne zarejestrowane w sesji. Kluczem tej tablicy jest nazwa zarejestrowanej zmiennej. Tablicę można użyć do rejestrowania zmiennych sesyjnych. Wystarczy przypisać wartość odpowiedniemu kluczowi tej tablicy aby zmienna została zarejestrowana. 21-11-2009 Technologie internetowe II
Technologie internetowe II Przykład zliczanie ile razy dana osoba odczytała daną stronę z czasie jednej sesji. <? session_start(); /* można pominąć jeśli jest się pewnym że włączona jest opcja auto_start */ if (!isset($_SESSION['count'])) { // jeśli zmienna nie jest zarejestrowana $_SESSION['count'] = 0; // przypisz jej początkową wartość } else { // jeśli jest zarejestrowana $_SESSION['count']++; // zwiększ jej wartość echo 'Strona odczytana '.$_SESSION['count'].' razy w ciągu tej sesji'; ?> 21-11-2009 Technologie internetowe II
Przekierowania
Technologie internetowe II Przekierowania Problem skryptu – zgadywanki: po odgadnięciu liczby nadal wyświetla formularz. Kod HTML statycznie zapisany w skrypcie. Można dokonać przekierowania. Serwer komunikując się z klientem najpierw wysyła nagłówki, można dodać swoje dzięki funkcji header (). Dowolny znak poza blokiem PHP powoduje wysyłanie nagłówka!!! 21-11-2009 Technologie internetowe II
Zgadywanie liczby 2 Tutaj jest przekierowanie <?php $liczba_do_odgadniecia = 42; $liczba_prob = (isset($_POST['liczba_prob'])) ? $_POST['liczba_prob'] + 1 : 1; if (!isset($_POST['liczba'])) { $komunikat = "Witaj w maszynie zgadującej!"; } else if ($_POST['liczba'] > $liczba_do_odgadniecia) { $komunikat = "Liczba $_POST[liczba] jest zbyt duża, spróbuj mniejszej."; } else if ($_POST['liczba'] < $liczba_do_odgadniecia) { $komunikat = "Liczba $_POST[liczba] jest zbyt mała, spróbuj większej."; } else { // poprawna odpowiedź header(„location: gratulacje.html”); exit; $liczba = $_POST['liczba'];?> <html><head> <title>Zachowywanie stanu w ukrytym polu</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"> </head><body> <h1><?php echo $komunikat ?></h1> <p><strong>Numer próby:</strong> <?php echo $liczba_prob; ?></p> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST"> <p><strong>Wybierz liczbę:</strong> <input type="text" name="liczba" value="<?php echo $liczba; ?>"> <input type="hidden" name="liczba_prob" value="<?php echo $liczba_prob; ?>"> <p><input type="submit" value="Wyślij"></p> </form></body></html> Tutaj jest przekierowanie Ukryte pole w tym wierszu 21-11-2009 Technologie internetowe II
Wysyłanie poczty
Technologie internetowe II Konfiguracja systemu Dane pobrane w formularzu można też wysłać pocztą elektroniczną. Przed użyciem funkcji mail() należy skonfigurować system. Plik php.ini: funkcja mail() musi mieć dostęp do serwera poczty wychodzącej należy też podać adres zapisywany w polu „From:” Serwer WWW musi być ponownie uruchomiony. 21-11-2009 Technologie internetowe II
Technologie internetowe II Formularz kontaktowy <html> <head> <title>Formularz kontaktowy</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"> </head> <body> <form action="wyslijmail.php" method="POST"> <p><strong>Imię i nazwisko:</strong><br> <input type="text" size="25" name="imie"></p> <p><strong>Adres email:</strong><br> <input type="text" size="25" name="email"></p> <p><strong>Wiadomość:</strong><br> <textarea name="wiadomosc" cols=30 rows=5></textarea></p> <p><input type="submit" value="Wyślij"></p> </form></body></html> 21-11-2009 Technologie internetowe II
Technologie internetowe II Wynik 21-11-2009 Technologie internetowe II
Formularz kontaktowy - PHP <html><head><title>Wysyłanie formularza kontaktowego</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"></head><body> <?php echo "<p><b>$_POST[imie]</b>, dziękujemy za wypełnienie formularza!</p>"; echo "<p>Twój adres to: <b>$_POST[email]</b>.</p>"; echo "<p>Twoja wiadomość to:<br>"; echo "$_POST[wiadomosc] </p>"; // treść $tresc = "Imię i nazwisko: $_POST[imie]\n"; $tresc .= "Adres email: $_POST[email]\n"; $tresc .= "Wiadomość: $_POST[wiadomosc]\n"; // nagłówki $odbiorca = "ty@twojadomena.com"; $temat = "Formularz kontaktowy"; $naglowki = "From: Strona WWW <jakisadres@domena.com> \n"; $naglowki .= "Reply-To: $_POST[email]"; // wysyłanie wiadomości mail($odbiorca, $temat, $tresc, $naglowki); ?></body></html> Tutaj budujemy treść wiadomości Tworzenie odbiorcy, tematu i nagłówka Jeżeli używamy serwera Windows to ma być \r\n 21-11-2009 Technologie internetowe II
Formularz kontaktowy - HTML <html><head><title>Wysyłanie formularza kontaktowego - wersja HTML</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"></head> <body> <?php echo "<p><b>$_POST[imie]</b>, dziękujemy za wypełnienie formularza!</p>"; echo "<p>Twój adres to: <b>$_POST[email]</b>.</p>"; echo "<p>Twoja wiadomość to:<br>"; echo "$_POST[wiadomosc] </p>"; // treść $tresc = "<p><strong>Imię i nazwisko:</strong> $_POST[imie]</p>"; $tresc .= "<p><strong>Adres email:</strong> $_POST[email]</p>"; $tresc .= "<p><strong>Wiadomość:</strong> $_POST[wiadomosc]</p>"; // nagłówki $odbiorca = "ty@twojadomena.com"; $temat = "Formularz kontaktowy";$naglowki = "MIME-Version: 1.0\r\n"; $naglowki .= "Content-type: text/html; charset=ISO-8859-2\r\n"; $naglowki .= "From: Strona WWW <jakisadres@domena.com> \n"; $naglowki .= "Reply-To: $_POST[email]"; // wysyłanie wiadomości mail($odbiorca, $temat, $tresc, $naglowki); ?></body></html> Formatowanie za pomocą znaczników HTML Nadanie wartości nagłówkom MIME 21-11-2009 Technologie internetowe II
Przesyłanie plików
Technologie internetowe II Obsługa plików Przekazanie pliku na serwer - n.p. dodanie zdjęcia do galerii. Robi się to przy pomocy pola typu "file" w formularzu i odpowiednich zmiennych w skrypcie odbierającym dane. Plik przesyła się korzystając z pola formularza typu "file". Formularz musi być wysyłany metodą POST. Formularz musi zawierać atrybut ENCTYPE=”multipart/form-data”. 21-11-2009 Technologie internetowe II
Technologie internetowe II Plik1.php <html> <body> <form action="plik2.php" method="POST" ENCTYPE="multipart/form-data"> <input type="file" name="plik"/> <input type="submit" value="Wyślij plik"/> </form> </body> </html> 21-11-2009 Technologie internetowe II
Technologie internetowe II Upload plików Na stronie do której został wysłany formularz dostępna będzie wielowymiarowa tablica asocjacyjna $_FILES. Pierwszym wymiarem są pola typu file z formularza (klucze są nazwami tych pól), a w drugim informacje o przesłanym pliku. Informacje te to: tmp_name - nazwa tego pliku na serwerze wraz ze ścieżką; używając tego pola można uzyskać dostęp do przesłanego pliku name - nazwa pliku jaką posiadał u użytkownika type - typ MIME pliku, np. text/plain lub image/gif; informacja ta jest dostępna tylko jeśli przeglądarka klienta dostarczyła takiej informacji. size - wielkość pliku w bajtach 21-11-2009 Technologie internetowe II
Technologie internetowe II Przesłanie pliku <html> <head> <title>Prosty formularz, pozwalający na przesłanie pliku</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"></head> <body> <form action="wyslij_plik.php" enctype="multipart/form-data" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="51200"> <p><strong>Plik do wysłania:</strong> <input type="file" name="plik"></p><p><input type="submit" value="Wyślij!"></p> </form> </body> </html> Max rozmiar pliku Nazwa pola 21-11-2009 Technologie internetowe II
Technologie internetowe II Zabezpieczenia Przesyłanie plików na serwer jest sprawą dosyć niebezpieczną, dlatego należy odpowiednio się zabezpieczyć. Funkcja is_uploaded_file() - sprawdza czy podany plik faktycznie został odebrany od użytkownika - sprawdzenie takie jest istotne, gdyż w przypadku źle napisanego skryptu "włamywacz" będzie mógł odczytać z serwera dowolny plik, do którego prawo odczytu posiada użytkownik jako który pracuje serwer WWW. Jeśli wszystkie próby przebiegną pomyślnie, plik jest przenoszony w docelowe miejsce przy pomocy funkcji move_uploaded_file(). Jjeśli plik o takiej samej nazwie już istnieje, zostanie nadpisany, dlatego też należy najpierw to sprawdzić przy pomocy funkcji file_exists(). Kolejnym niebezpieczeństwem jest możliwość wstawienia na serwer skryptu PHP zawierającego "niebezpieczne instrukcje". Można się przeciw temu zabezpieczyć sprawdzając rozszerzenie lub typ przesyłanego pliku. Jeśli typ pliku jest inny od oczekiwanego, plik można albo usunąć albo zmienić mu rozszerzenie. Docelowy katalog musi mieć odpowiednie prawa dostępu. Użytkownik, jako który pracuje serwer WWW musi mieć prawo zapisu do tego katalogu. 21-11-2009 Technologie internetowe II
Technologie internetowe II Odbiór pliku <?php $max_rozmiar = 1024*1024; if (is_uploaded_file($_FILES['plik']['tmp_name'])) { if ($_FILES['plik']['size'] > $max_rozmiar) { echo 'Błąd! Plik jest za duży!'; } else { echo 'Odebrano plik. Początkowa nazwa: '.$_FILES['plik']['name']; echo '<br/>'; if (isset($_FILES['plik']['type'])) { echo 'Typ: '.$_FILES['plik']['type'].'<br/>'; } move_uploaded_file($_FILES['plik']['tmp_name'], $_SERVER['DOCUMENT_ROOT'].'/foto/'.$_FILES['plik']['name']); } else { echo 'Błąd przy przesyłaniu danych!'; ?> 21-11-2009 Technologie internetowe II
Obsługa przesłanego pliku <?php $plik_katalog = "/katalog/dla/przesylanych/plikow"; foreach($_FILES as $plik_nazwa => $plik_tablica) { echo „Ścieżka: ".$plik_tablica['tmp_name']."<br>\n"; echo "nazwa: ".$plik_tablica['name']."<br>\n"; echo "typ: ".$plik_tablica['type']."<br>\n"; echo "rozmiar: ".$plik_tablica['size']."<br>\n"; if (is_uploaded_file($plik_tablica['tmp_name'])) { move_uploaded_file($plik_tablica['tmp_name'], "$plik_katalog/$plik_tablica[name]") or die ("Nie można przenieść pliku"); echo "Plik został przeniesiony!<br><br>"; } ?> 21-11-2009 Technologie internetowe II
Technologie internetowe II Cookies Mechanizm cookies (ciasteczka) do przechowywania niewielkich ilości danych na komputerze oglądającego stronę (np. informacje o imieniu i nazwisku lub nazwie użytkownika w tym serwisie) Ciasteczka ustawione przez dany serwis dostępne są tylko dla niego i ustawiane są na jakiś czas. Ciasteczka przekazywane są za pomocą nagłówków HTTP. Muszą być one wysłane zanim do przeglądarki zostanie wysłana jakakolwiek inna treść. Przed zapisaniem ciasteczka nie może być żadnego wywołania funkcji echo i pochodnych, a także tag otwierający tryb PHP musi być pierwszymi znakiami w pliku - nie może być żadnej spacji ani pustych wierszy. PHP automatycznie odczytuje ciasteczka i zamienia je na zmienne. Są one przechowywane w superglobalnej tablicy asocjacyjnej $_COOKIE, w której kluczami są nazwy ciasteczek. Standardowo nie ma możliwości przechowywania tablic w ciasteczkach, lecz można to obejść. Przed zapisaniem tablicy w ciasteczku należy użyć funkcji serialize(). Zamienia ona tablicę na ciąg znaków. Do ponownego odczytania takiej tablicy służy funkcja unserialize(). 21-11-2009 Technologie internetowe II
Technologie internetowe II Cookies Ciasteczka ustawia się je pomocą funkcji setcookie ( nazwa, wartość, czas_wygaśnięcia, ścieżka, domena, bezpieczeństwo). Tylko pierwszy parametr jest niezbędny. Oznacza on nazwę ciasteczka - taką nazwą będzie miała zmienna stworzona przez PHP po ponownym odczytaniu ciastek. Parametr "wartość" - taka wartość będzie przechowana w ciasteczku o podanej nazwie. Parametr czas_wygaśnięcia oznacza czas, po jakim ciastko zostanie skasowane. Czas ten należy podać jako ilość sekund od 1.1.1970. Aktualny czas w tym formacie zwracany jest przez funkcję time(). Przykłady: godzina - time()+3600 dzień - time()+86400 miesiąc - time()+30*86400 Jeśli czas będzie wcześniejszy niż aktualny czas, ciasteczko zostanie skasowane. Jeśli będzie równy zero - ciasteczko będzie ważne tylko do zamknięcia przeglądarki. Dwa następne parametry używane są do wskazania adresu, dla którego dostępne będą cookiesy. Jeśli ostatni parametr jest ustawiony na 1, to cookie będzie przesłany za pomocą szyfrowanego połączenia HTTPS. 21-11-2009 Technologie internetowe II
Technologie internetowe II <?php // zapis $tablica = Array('a' => 'pierwszy', 'b' => 'drugi'); setcookie('tablica', serialize($tablica), time()+3600); // odczyt zabezpieczony przed nieistniejącym ciasteczkiem if (isset($_COOKIE['tablica'])) { $tablica = unserialize($_COOKIE['tablica']); } else { $tablica = Array(); } ?> 21-11-2009 Technologie internetowe II
Technologie internetowe II register_globals Można ustawićw pliku konfiguracyjnym php.ini dyrektywę register_globals. Odpowiedzialna za rejestrowanie danych otrzymanych z formularzy, ciastek, sesji czy serwera jako zmienne globalne. Jeśli dyrektywa register_globals została ustawiona na on to wszystkie zmienne przekazane do skryptu dostępne są w postaci $nazwa_zmiennej, bez potrzeby stosowania żadnych tablic. Powoduje to pewne niebezpieczeństwo. Używając zmiennych globalnych nie można stwierdzić, czy dana wartość pochodzi z sesji czy została podana w URLu metodą GET – możliwość obchodzenia zabezpieczeń. Zalecane jest używanie odpowiednich tablic. Począwszy od wersji 4.2.0, dyrektywa register_globals jest domyślnie wyłączona. Tak więc pisząc skrypt dla nieznanego serwera trzeba się liczyć z ewentualnością braku dostępu do zmiennych globalnych. 21-11-2009 Technologie internetowe II