PHP Tematyka wykładów: Język PHP PHP i bazy danych Rozszerzenia PHP
PHP i bazy danych Plan wykładu: Wprowadzenie Buforowanie stron Uwierzytelnianie Sesje Baza danych COM, DLL XML Podsumowanie
Wprowadzenie Połączenie PHP i baz danych: Korzyści: Różna zawartość tej samej strony Udostępnianie danych na zewnątrz Zdalna modyfikacja danych Trudności: Serwery proxy, itp. Tworzenie sesji użytkownika Czas trwania operacji (ustalić timeout)
Buforowanie stron Poziomy buforowania: Serwer proxy Cache przeglądarki Rozwiązanie: Uzupełnienie zwracanej strony o informacje dotyczące czasu jej ważności
Buforowanie stron (2) Przykład metody GET: GET /test.php?user=ala&pass=kotek HTTP/1.1 Host: przyklad.serwer.com Przykład metody POST: POST /test.php HTTP/1.1 Host: przyklad.serwer.com user=ala&pass=kotek
Buforowanie stron (3) Przykład odpowiedzi serwera: HTTP/1.0 200 OK Date: Sat, 20-May-95 03:25:12 GMT Content-type: text/html Last-modified: Wed, 14-Mar-95 18:15:23 GMT <html> <head><title>to jest test</title></head> <body>test</body> </html>
Buforowanie stron (4) Modyfikacja nagłówka: <?php // data w przeszłości header("expires: Mon, 26 Jul 1997 05:00:00 GMT"); // zawsze zmodyfikowany header("last-modified: ". gmdate("d, d M Y H:i:s")." GMT"); // dla HTTP/1.1 header( Cache-Control: no-store, no-cache,. must-revalidate ); header("cache-control: post-check=0, pre-check=0", false); // dla HTTP/1.0 header("pragma: no-cache");?>
Buforowanie stron (5) Uwagi: Funkcji header należy użyć przed wysłaniem jakiegokolwiek znaku do przeglądarki Można wykorzystać inkludowanie plików
Przekierowywanie <?php header("location: http://www.x.com/"); exit;?>
Uwierzytelnianie Wysłanie żądania uwierzytelnienia: header( WWW-Authenticate: BASIC. realm= Test ); header("http/1.0 401 Unauthorized"); Pobranie wyników: $_SERVER['PHP_AUTH_USER'] $_SERVER['PHP_AUTH_PW']
Uwierzytelnianie (2) Uwagi: Nie obsługiwane przez niektóre przeglądarki Dane nie są szyfrowane IIS problemy z podmianą nagłówka header('status: 401 Unauthorized');
Cel: Sesje Zachowanie ciągłości w komunikacji z użytkownikiem Trudności: HTTP protokół bezpołączeniowy Adres IP i port komputera użytkownika za mało Rozwiązanie: Przekazywanie ID sesji przez mechanizm cookies adres URL Nie zaleca się przechowywania zmiennych sesyjnych na lokalnym komputerze
Sesje (2) Przekazywanie ID sesji problemy: cookies można wyłączyć adres URL widoczne ID sesji należy samemu pilnować odnośniki (php.ini: session.use_trans_sid=0) Sesje są automatycznie obsługiwane od PHP 4.0
Sesje (3) Funkcje do obsługi sesji: Inicjalizacja (na każdej stronie, albo ustawiony parametr php.ini: session.auto_start=1) session_start(); Zamknięcie sesji (logout) session_destroy();
Sesje (4) Zmienne sesyjne (session.bug_compat_42=on): Rejestracja zmiennych sesyjnych (jednorazowo) session_register( nazwa1, ); Używanie zmiennych sesyjnych $nazwa1= ala ma kotka ; $zdanie= Zdanie:.$nazwa1; if(isset($nazwa1))... Usuwanie zmiennych sesyjnych session_unregister( nazwa1, );
Sesje (5) Zmienne sesyjne (session.bug_compat_42=off): Rejestracja i używanie zmiennych sesyjnych if (!isset($_session['count'])) $_SESSION['count']=0; else $_SESSION['count']++; Usuwanie zmiennych sesyjnych unset($_session['count']);
Sesje (6) Zmiany dla kompatybilności 4.2.0 -> 4.3.0: Zmienne sesyjne rejestrowane w globalnym obszarze session.bug_compat_42 = 1 Generowanie ostrzeżenia session.bug_compat_warn = 1
Sesje (7) Przekazywanie ID sesji przez URL: Linki <a href= www.x.pl/test.php?<?=sid?> > Formularze z metodą GET <form action= www.x.pl/test.php?<?=sid?> > Formularze z metodą POST <input type= hidden name=<?=session_name()?> value=<?=session_id()?> >
Sesje (8) Uwagi: Przełącznik kompilacji --enable-trans-sid ustawiony od 4.2.0 // w nowej wersji po session_start() define( SID, session_name(). =. session_id());
Sesje (9) Sposób pamiętania sesji: W odpowiednim pliku (domyślnie) jeden plik na sesję w katalogu /tmp (php.ini: session.save_path) zmienne są zachowane przez serialize Ręcznie można przechowywać w bazie danych, należy wtedy stworzyć odpowiednie procedury (session_set_save_handler())
Sesje (10) Problemy: Odświeżanie strony Strona poprzednia (przycisk wstecz )
Baza danych Dostępny standardowy interfejs: Łączenie z bazą danych (m.in. persistent) Wykonanie zapytania SQL Pobranie wyników Dostęp do dodatkowych informacji Uwagi: Nazwy funkcji są zależne od typu bazy danych
Łączenie z bazą danych: Podstawowe Baza danych (2) <typ>_connect( server, user, password ); Persistent <typ>_pconnect( server, user, password ); Uwagi: W wyniku zwraca uchwyt połączenia Typy: odbc, mysql, pg, Dla ODBC musi być dobrze skonfigurowany DSN Połączenie podstawowe jest automatycznie zamykane
Baza danych (3) Wykonanie zapytania: Ogólnie: $exe_id=<typ>_query($conn_id, sql ); ODBC: $exe_id=odbc_exec($conn_id, sql ); $stmt=odbc_prepare($conn_id, sql ); $exe_id=odbc_execute($stmt);
Pobranie wyników: Baza danych (4) Pojedyncze pole (czasem tabl. asoc.): <typ>_fetch_row($exe_id); <typ>_result($exe_id, <nr/nazwa pola>); Tablica asocjacyjna+indeksowana: <typ>_fetch_array($exe_id); Obiekt: <typ>_fetch_object($exe_id); Zwolnienie pamięci: <typ>_free_result($exe_id);
Baza danych (5) Dodatkowe informacje: ID ostatnio dodanego rekordu: pg_last_oid($exe_id); mysql_insert_id($exe_id); Liczba zmienionych wierszy: <typ>_affected_rows($exe_id); Liczba wierszy i kolumn do pobrania: <typ>_num_rows($exe_id); // -1 - nieznane <typ>_num_fields($exe_id); Błędy: <typ>_error($conn_id);
Baza danych (6) $conn_id=odbc_connect("php","",""); $exec_id=odbc_exec($conn_id, "SELECT * From Osoba"); while(odbc_fetch_row($exec_id)) { for($j=1; $j<=odbc_num_fields($exec_id); $j++) { echo odbc_result($exec_id,$j); } }
COM Obiekty COM (tylko Microsoft): Tworzenie: $ob = new COM( nazwa_obiektu [, string server_name [, int codepage]] ); Używanie: $ob-> Zwolnienie: $ob->release(); $ob=null;
COM (2) $baza = new COM("ADODB.Connection"); $plik=dirname ($_SERVER["SCRIPT_FILENAME"])."\\osoby.mdb"; $baza->open( Provider=. Microsoft.Jet.OLEDB.4.0. ;Data Source=.$plik);
COM (3) $wynik = $baza->execute( "SELECT * From Osoba"); // lub foreach od PHP 5.0 while(! $wynik->eof) { for($j=0; $j<$wynik->fields->count; $j++) { echo $wynik->fields[$j]->value; } $wynik->movenext(); } // usunięcie obiektów
COM (4) com_load_typelib('outlook.application'); // after that the code from Purplerain $objapp = new COM("Outlook.Application"); $myitem = $objapp->createitem(olmailitem); $a=$myitem->recipients->add("adres"); $myitem->subject="temat"; $myitem->body="treść listu!"; $myitem->display(); $myitem->send();
Win32 API // Load the extension in dl("php_w32api.dll"); // Register the GetTickCount function from kernel32.dll w32api_register_function("kernel32.dll", "GetTickCount", "long"); // Register the MessageBoxA function from User32.dll w32api_register_function("user32.dll", "MessageBoxA", "long");
Dokument XML: XML format tekstowy (czytelny) dane zamknięte w znaczniki znaczniki parami zamykane jeden korzeń w obrębie znacznika unikalne parametry wartości parametrów w cudzysłowie
XML (2) Dokument XML przykład: <?xml version= 1.0?> <p> <BOLD> t1 </BOLD> <EMPHASIS> t2 </EMPHASIS> <LITERAL> t3 </LITERAL> </p>
XML (3) Dokument XML przykład 2: <?xml version="1.0" encoding="windows-1250"?> <config> <chains> <chain name="morfologia"> <module id="morf_id" /> </chain> </chains> </config>
XML (4) Dokument XML dostęp: XML Parser wywoływanie zdarzeń (callback) tylko do odczytu XMLReader szybki, jednokierunkowy, niebuforowany odczyt xmlwriter szybki, jednokierunkowy, niebuforowany zapis
XML (5) Dokument XML dostęp (2): DOM (Document Object Model) drzewo przechowywane w pamięci skomplikowany interfejs SimpleXML drzewo obiektów PHP
XML (6) Obsługa plików XML (XML Parser): Utworzenie funkcji (handlerów) startelement($parser, $name, $attrs); endelement($parser, $name); characterdata($parser, $data);
XML (7) Obiekt parsera XML: Utworzenie obiektu parsera $xml_parser = xml_parser_create(); xml_set_element_handler( $xml_parser, startelement, endelement ); xml_set_character_data_handler( $xml_parser, characterdata ); Usunięcie obiektu parsera xml_parser_free($xml_parser);
XML (8) Parsowanie: Wysłanie tekstu do parsera xml_parse($xml_parser, $data, [end]); Błędy xml_get_error_code($xml_parser); xml_error_string(<nr_błędu>); xml_get_current_line_number( $xml_parser)
XML (9) Przykład tworzenia pliku XML (DOM): $doc = domxml_new_doc("1.0"); $root = $doc->add_root("html"); $head = $root->new_child("head", ""); $head->new_child("title", "Tytuł"); echo htmlentities($doc->dump_mem());
Podsumowanie Linki: www.php.net strona projektu PHP conf.php.net konferencje o PHP www.mysql.com MySQL www.postgresql.org PostgreSQL msdn.microsoft.com - MSDN Microsoft