====== Laboratorium, PHP # 4 ====== ===== Ćwiczenie 1: Dostęp do zewnętrznych danych ===== Przetestuj działanie poniższych programów. Widzisz różnicę? Zwróć uwagę na napis na środku. ===== Ćwiczenie 2: Dostęp do zewnętrznych danych w Wikipedii ===== Korzystając z serwisu Wikipedia napisz program, który: - zapyta o hasło do znalezienia, - pobierze informacje o w/w haśle, - wyświetli tą informację. Definicje haseł można uzyskać korzystając z API Wikipedii: https://www.mediawiki.org/wiki/API:Main_page Informacje zwracane są w postaci JSON, np. zapytanie o hasło //Makaron// (proszę zwrócić uwagę na parametr ''titles'' przekazywany metodą GET.): https://pl.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&explaintext=&titles=Makaron zwróci: {"batchcomplete":"", "query": {"pages": {"136559": {"pageid":136559, "ns":0, "title":"Makaron", "extract":"Makaron \u2013 produkt \u017cywno\u015bciowy wytwarzany na bazie m\u0105ki, wody i niekiedy jaj (m\u00f3wimy wtedy o makaronie jajecznym) oraz innych sk\u0142adnik\u00f3w, o szerokiej gamie kszta\u0142t\u00f3w i zastosowa\u0144." } } } } W PHP obsługę komunikacji z Wikipedią można zaprogramować w poniższy sposób. $c=curl_init('https://pl.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&explaintext=&titles=Makaron'); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); $dane=curl_exec($c); curl_close($c); $tablica=json_decode($dane,true); foreach($tablica['query']['pages'] as $art) { echo $art['extract']; } Uwaga, jeżeli w haśle wystąpią znaki diakrytyczne należy użyć funkcji: ''urlencode()'' przed wysłaniem zapytania do Wikipedii. Więcej informacji o przetwarzaniu JSON można znaleźć pod adresem: http://www.php.net/manual/en/ref.json.php ==== Informacje dodatkowe: Wyszukiwanie słów kluczowych w Wikipedii ==== Wyszukiwanie słów kluczowych może być zrealizowane np. tak: https://pl.wikipedia.org/w/api.php?format=json&action=query&list=search&srlimit=10&srsearch=wilk W/w przykład zwróci maksymalnie 10 rekordów (''srlimit'') danych odnośnie słowa kluczowego "wilk" (''srsearch''). ==== Informacje dodatkowe: Dostęp do danych w CouchDB ==== Korzystając z dowolnego widoku bazy CouchDB napisz w PHP program wyświetlający jako liste (wypunktowanie) kolejne identyfikatory dokumentów zgormadzonych w twojej bazie danych. Alternatywnie możesz skorzystać z wbudowanego widoku ''_all_dbs'' zwracającego nazwy baz danych np.: http://awing.kis.agh.edu.pl:5984/_all_dbs - przeczytaj zasób, - dokonaj konwersji JSON-tablica, - wyświetl odpowiednie informacje iterując po tablicy. Do przesyłania danych wykorzystaj biblioteke CURL (Uwaga: jeżeli dostęp do CouchDB jest chroniony, we wszystkich poniższych adresach HTTP trzeba dodać informacje o nazwie użytkownika i haśle tj.: http://... -> http://login:haslo@... ): **Uwaga:** dane z postaci JSON zwracanej przez CouchDB mogą być konwertowane do tablic asocjacyjnych albo obiektów PHP. W powyższym przykładzie jest to tablica asocjacyjna. Podpowiedź: sprawdź w dokumentacji PHP jakie są dostępne funkcje do przetwarzania JSON: http://www.php.net/manual/en/ref.json.php Do przesyłania danych można również wykorzystać ''fopen'', jednak aktualnie funkcja ta jest niedostępna na serwerach: borg, charon i student. $h=fopen("http://awing.ia.agh.edu.pl:5984/_all_dbs", "r"); if ($h) { while (($bufor=fgets($h))!=false) { echo $bufor; } fclose($h); } Informacje na temat używania innych metod HTTP (POST, PUT, DELETE) można znaleźć: http://www.php.net/manual/en/context.http.php ==== Informacje dodatkowe: Dostęp do bazy CouchDB ==== Przetestuj działanie skryptu couchshell.php:
CouchShell

Input

URI:

Method: /> GET /> POST /> PUT /> DELETE
Content type:
POST/PUT:

Output

JSON

Decoded JSON


===== Ćwiczenie 3: Klasy i obiekty, generacja dokumentów PDF ===== Dostarczona jest struktura danych (np. pochodząca z odczytu z bazy danych) przechowująca informacje o flocie samochodów: // dane: marka samochodu, kolor, nr rej., przebieg, stan techniczny $dane = array( array('VW Passat','srebrny', 'DW5789', 98000, 'dobry'), array('Syrena','żółty', 'WA4389', 60000, 'zły'), array('Ford Focus','czarny', 'KR1243', 21000, 'dobry'), array('Honda Civic','zielony', 'KR9834', 8000, 'dobry') ); Celem ćwiczenia jest napisanie programu w PHP generującego dokument PDF, który pokaże powyższe dane w postaci {{ :pl:paw:tabela.pdf |tabelarycznej}}. Do wykonania ćwiczenia użyj popularnej biblioteki TCPDF https://tcpdf.org/, tam też znajdziesz wiele przykładów jej użycia (Uwaga: dokumentacja klasy: https://tcpdf.org/docs/srcdoc/tc-lib-pdf/classes-Com-Tecnick-Pdf-Tcpdf/ alternatywnie można zaglądnąć do pliku ''tcpdf.php''). Biblioteka jest w całości napisana w PHP. Aktualną wersję możesz pobrać z: https://github.com/tecnickcom/TCPDF/archive/6.3.5.zip Archiwum rozpakuj w katalogu, z Twoimi skryptami PHP (zwróć uwagę na odpowiednie prawa dostępu). Przykład użycia biblioteki znajdziesz poniżej. require_once('TCPDF-6.3.5/tcpdf_import.php'); $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); // $orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8' $pdf->SetFont('dejavusans', '', 10); // użyj czcionki DejavuSans, domyślne czcionki PDF nie uwzględniają polskich znaków $pdf->setPrintHeader(false); // wyłącz nagłówki stron $pdf->setPrintFooter(false); // wyłącz stopki stron $pdf->setMargins(10,10,10,10); // ustaw marginesy $pdf->addPage(); // dodaj stronę $pdf->setXY(80,80); // ustaw kursor na pozycji 80x80mm $pdf->Write(0, 'Przykładowy napis na stronie.'); // dodaj napis $pdf->Output() // wygeneruj dokument PDF na standardowym wyjściu Do sporządzenia tabelki możesz użyć metody ''writeHTML()'', która generuje treść na podstawie składni HTML. Z w/w danych wygeneruj tabelkę w HTML, którą przypisz do zmiennej np. ''$html='........' ''. Możesz użyć poniższego kodu. Więcej przykładów znajdziesz pod adresem: https://tcpdf.org/examples/example_006/ require_once('TCPDF-6.3.5/tcpdf_import.php'); $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); $pdf->SetFont('dejavusans', '', 10); // domyślne czcionki PDF nie uwzględniają polskich znaków $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->setMargins(10,10,10,10); $html='
'; /* Tutaj powinien być kod generujący zawartość zmiennej $html Warto użyć pętli foreach. ... */ $html.='
'; $pdf->addPage(); $pdf->writeHTML($html); $pdf->Output(); ===== Ćwiczenie 4: Klasy i obiekty ===== Napisz klasę ''Logowanie'' umożliwiającą obsługę danych do logowania tj. dodawanie par login-hasło, weryfikację hasła, usuwanie par login-hasło. W/w informacje powinny być przechowywane w bazie danych z wykorzystaniem PDO. Klasa powinna udostępniać następujące metody: - ''dodaj(login,hasło)'' -- dodawanie pary login-hasło; uwaga hasła powinny być przechowywane w postaci zakodowanej z wykorzystaniem funkcji skrótu np. ''md5()'' tj.:$zakodowane=md5($haslo); - ''sprawdz(login,hasło)'' -- zwracającą prawdę, jeżeli login i hasło zgadzają się; uwaga: przy zakodowaniu z użyciem funkcji skrótu, porównać należy wartość funkcji skrótu na podanym haśle, z wartością przechowywaną w bazie danych, - konstruktor -- nawiązujący połączenie ze źródłem danych. Do przetestowania działania klasy możesz użyć poniższego kodu. dodaj('franek','rt56'); if ($logowanie->sprawdz('franek','rt56')) echo 'Hasło prawidłowe'; if (!$logowanie->sprawdz('franek','xxxx')) echo 'Hasło błędne'; ?> ^ TOP TIP ^ | Zacznij od definicji klasy i wszystkich metod, potem zakoduj weryfikację użytkownika (używając stałych wartości dla nazwy i hasła), potem dodaj komunikację z bazą danych. | ==== PostgreSQL ==== Dostęp do bazy danych PostgreSQL na charonie albo borgu można zrealizować w poniższy sposób. query('SELECT * FROM jakas_tabela;') as $row) { print_r($row); } $dbh = null; ?> W przypadku korzystania z tego samego serwera dla skrytpow PHP i bazy danych, do PostgreSQL można podłączyć się nie używając hasła w następujący sposób. query('SELECT * FROM jakas_tabela;') as $row) { print_r($row); } $dbh = null; ?> ==== MySQL ==== Dostęp do bazy danych MySQL na serwerze mysql.agh.edu.pl (hsło dostępowe mozna uzyskac przez panel AGH: https://panel.agh.edu.pl/ ) można zrealizować w poniższy sposób. query('SELECT * FROM jakas_tabela;') as $row) { print_r($row); } $dbh = null; ?>