Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf ·...

26
Języki programowania wysokiego poziomu Forum, Blog, Sample DB - wskazówki

Transcript of Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf ·...

Page 1: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

Języki programowaniawysokiego poziomu

Forum, Blog, Sample DB- wskazówki

Page 2: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Skrypt PHP może włączać (przez inkluzję) inne skrypty;

Służą do tego instrukcje (pseudo-funkcje):- include,- require,- require_once

• Jeżeli włączany skrypt zawiera HTML, jest on wysyłany do wyjściowego strumienia skryptu głównego, jeżeli PHP – jest interpretowany

• Rozszerzenie nazwy pliku nie jest istotne;niektóre podręczniki zalecają .inc;

• Pliki powinny być umieszczone poza public_html lub zabezpieczone przez wczytaniem do przeglądarki

Page 3: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Instrukcja include zwykle służy do włączania gotowego,

powtarzającego się fragmentu HTML:<?phpinclude "header.php";include "banner.php";// zmienne elementy strony

include "footer.php";?>

Page 4: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Instrukcja require_once zwykle służy do włączania

pomocniczych skryptów, zawierających definicje funkcji i zmiennych://index.php<?phprequire_once "tepmlate.php";

//template.php<?php$pageTemplate = "...";

Page 5: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Zabezpieczenie przed wczytaniem pomocniczego skryptu,

oparte na własnych zmiennych//index.php<?phpdefine ("INDEX", "1"); // $INDEX = true;require_once "tepmlate.php";

//template.php<?phpif (!isset (INDEX)) { header ("Location: index.php"); die ();}// zasadnicza treść skryptu

Page 6: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Zabezpieczenie przed wczytaniem pomocniczego skryptu,

oparte na tablicy sesji (zwykle i tak jest używana)//index.php<?phpsession_start();include "tepmlate.php";

//template.php<?phpif (!isset ($_SESSION)) { header ("Location: index.php"); die ();}// zasadnicza treść skryptu

Page 7: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Definiowanie długich łańcuchów tekstu

$pageTemplate = " <!DOCTYPE ...". "<html>". "<head>";

$pageTemplate = <<<EOM<!DOCTYPE ...<html><head>...EOM;

Page 8: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu• Definiowanie funkcji

function Name ($arg1, $arg2, …, $argn){ // dowolne instrukcje // opcjonalnie: return result;}

• Wywołanie funkcji$val1 = 7;$val2 = "value";$res = Foo ($val1, $val2, 13, "other");

Page 9: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Argumenty i rezultat funkcji• Ponieważ w PHP nie ma deklaracji zmiennych,

typ rezultatu i typy argumentów nie są formalnie określone;Każda funkcja zwraca rezultat (niejawnie: NULL)function foo ($arg){ if ($arg>=0) return sqrt(arg);}$re = foo (4); // 2$re = foo (-7); // NULL$re = foo (0); // 0 if ($re === NULL) // …

Page 10: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Argumenty domyślne• Wiele standardowych funkcji PHP ma argumenty domyślne,

można też ich używać we własnych funkcjachfunction foo ($str, $low=true, $trm=true){ if ($low) $str = mb_strtolower($str); if ($trm) $str = trim($str); $res = "foo: «" . $str . "»";}

$re = foo (" RES "); // "foo: «res»"$re = foo (" RES ", true, true); //jw.

Page 11: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Argumenty przekazywane przez referencję• Domyślnie argumenty są przekazywane przez wartość;

dodanie znaku "&" przed nazwą zmienia argument w referencjęfunction foo ($def, &$ref){ $def++; $ref++;}

$a=1, $b=1;foo ($a, $b); // $a=1, $b=2

Page 12: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Wielokrotne użycie kodu • Powtarzające się w wielu skryptach czynności powinny być

wykonywane przez funkcje, wczytywane z pliku// index.phprequire_once "common.php";$conn = ConnectDatabase();

// common.phpfunction ConnectDatabase() { $conn = new mysqli (…); if (mysqli_connect_errno()!=0) { // header ??? die (); } $res = $conn->query ("SET NAMES 'utf8'"); return $conn;}

Page 13: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Tworzenie strony na podstawie szablonu• Opracowanie szablonu

wzorcowa strona (tylko HTML), wszystkie elementy, które będą na stronach tworzonych dynamicznie

• Zastąpienie elementów zmiennych unikalnymi ciągami znaków, (np. ===Nazwa===), zapisanie szablonu do zmiennej PHP

• Dynamiczne tworzenie – w skrypcie PHP – tylko elementów zmiennych strony, do zmiennych PHP, np.:$pgBody = "<h2>Xxx</h2>";while (...) $pgBody .= "<p>Yyy";

Page 14: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Tworzenie strony na podstawie szablonu (cd.)• Na koniec – wstawienie utworzonych dynamicznie elementów

do szablonu strony i wysłanie całości do przeglądarki:

$page = str_replace("===PageBody===", $pgBody, $pageTemplate );echo $page;

Page 15: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Korzyści tworzenia strony na podstawie szablonu:• Wszystkie strony serwisu mają dokładnie taki sam układ oraz

takie samo formatowanie,• Zmiana wyglądu jest łatwa – zamiast zmieniać kod wielu

skryptów, wystarczy zmodyfikować szablon,• Szablony można zapisać w bazie danych, wówczas zmiana

wyglądu może być dokonana dynamicznie,• Dokument HTML, „produkowany” przez skrypt, jest wysyłany

do przeglądarki dopiero na sam koniec działania skryptu:– W dowolnej chwili można zaprzestać tej produkcji lub całkowicie

zmienić treść (np. w reakcji na błąd) – normalnie to niemożliwe– W dowolnej chwili można skorzystać z nagłówków HTTP

(np. funkcje session_start, set_cookie, header) – normalnie jest to możliwe tylko na samym początku działania skryptu.

Page 16: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Obsługa daty i czasu• Obsługa daty i czasu jest jednym z najbardziej złożonych

problemów, ze względu na olbrzymią liczbę alternatyw, które trzeba uwzględnić:

– Różne kalendarze (gregoriański, juliański, hebrajski, perski, chiński, …)

– Nieregularność kalendarzy (np. różne liczby dni miesiąca, lata przestępne, …),

– Strefy czasowe, czas letni i zimowy,– Liczne regionalne i międzynarodowe formaty zapisu daty i czasu

(kolejność podawania numeru miesiąca/dnia, zegar 12/24H, …),– Sposób kodowania znaków przez funkcje generujące tekstowe

reprezentacje daty (np. „Środa, 15 styczeń 2012”), który może być inny niż stosowany dla całej strony

• PHP pozwala uwzględnić wszystkie te niuanse

Page 17: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Obsługa daty i czasu• PHP udostępnia wiele funkcji związanych z datą i czasem:

– Pobieranie znacznika czasu (bieżąca data i czas, liczbowo)– Formatowanie daty i czasu (łańcuch tekstowy, o dowolnym

układzie, na podstawie znacznika)– Przekształcenie łańcucha lub liczb (oznaczających rok, miesiąc,

dzień, godzinę, …) na znacznik czasowy

• MySQL udostępnia funkcje, które można użyć w zapytaniach m.in. INSERT oraz UPDATE

– DATE() – bieżąca data, rezultat typu DATE,– TIME() – bieżący czas, rezultat typu TIME– NOW() – bieżące data i czas, rezultat typu TIMESTAMP

Page 18: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Znacznik czasu (timestamp)• PHP udostępnia funkcję time(), która zwraca aktualny znacznik

czasu (liczba sekund od 01.01.1970, godz. 00:00):$currTime = time();echo "<p>Datownik: $crrTime "; // 130928376

Datownik udostępniony przez funkcję time() można zamienić na czytelny dla użytkownika napis przy pomocy funkcji PHP:date() lub strftime()

Page 19: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcje date() i strftime()• Dają możliwość niemal dowolnego formatowania daty i czasu,

np. miesiąc może być podany jako numer, nazwa lub nazwa skrócona, godzina – w zapisie 12 lub 24 godzinnym, uzupełniona zerem (08) lub nie (8) itp.

• Funkcja date ma tę wadę, że nazwy dni tygodnia oraz miesięcy podaje wyłącznie w j. angielskim, jednak jeżeli nazwy te nie są potrzebne, jest wystarczająca

Page 20: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja date()• Funkcja ma dwa argumenty: pierwszym jest łańcuch

formatujący, drugim, opcjonalnym, jest datownik:date ($format, [$timestamp]);

• Jeżeli datownik nie zostanie podany, funkcja pobierze aktualny datownik, zatem poniższe instrukcje są sobie równoważne:$dt = date ($format);$dt = date ($format, time());

• Łańcuch formatujący może zawierać dowolną kombinację znaków określających elementy składowe rezultatu funkcji;znaki nierozpoznane jako formatujące są pozostawiane bez zmian, np.:$tm = date ("H:i:s"); // 21:19:03$dt = date ("Y-m-d"); // 2011-05-19

Page 21: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja date()• Wybrane znaki formatujące (małe i wielkie litery są rozróżniane)

d – dzień miesiąca, z wiodącym zerem, 01-31D – dzień tygodnia, w skrócie, Mon – Sunm – numer miesiąca, z wiodącym zerem, 01-12M – nazwa miesiąca, w skrócie, Jan – DecF – nazwa miesiąca, np. JanuaryY – rok, 4 cyfry, np. 2011y – rok, 2 cyfry, np. 11H – godzina, format 24H, z zerem, 00 - 23h – godzina, format 12H, z zerem, 01 – 12i – minuta, z wiodącym zerem, 00-59s – sekundy, z wiodącym zerem, 00-59

Page 22: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja strftime()• Funkcja ma dwa argumenty: pierwszym jest łańcuch

formatujący, drugim, opcjonalnym, jest datownik :strftime ($format, [$timestamp]);

• Sposób wywołania strftime jest analogiczny, jak date, jednak istnieją dwie istotne różnice:- są inne znaki formatujące- strftime uwzględnia ustawienia regionalne;

Page 23: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja strftime()• Aby uzyskać nazwy dni tygodnia i miesięcy w j. polskim:

- zmienić ustawienia regionalne na polskie (funkcja setlocale),- wywołać strftime,- przekonwertować wynik z ISO-8859-2 (takiego używa funkcja strftime) na używany dla całej strony UTF-8 (funkcja iconv):

setlocale(LC_TIME, "pl_PL");$dtISO = strftime("%A"); // np. "Środa"$dtUTF = iconv("ISO-8859-2", "UTF-8", $dtISO);

Page 24: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja strftime()• Wybrane znaki formatujące (małe i wielkie litery są rozróżniane)

%d – dzień miesiąca, z wiodącym zerem, 01-31%a – dzień tygodnia, w skrócie, Mon – Sun%A – dzień tygodnia, np. Sunday %m – numer miesiąca, z wiodącym zerem, 01-12%b – nazwa miesiąca, w skrócie, Jan – Dec%B – nazwa miesiąca, np. January%Y – rok, 4 cyfry, np. 2011%y – rok, 2 cyfry, np. 11%H – godzina, format 24H, z zerem, 00 - 23%I – godzina, format 12H, z zerem, 01 – 12%M – minuta, z wiodącym zerem, 00-59%S – sekundy, z wiodącym zerem, 00-59

Page 25: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja strtotime()• Przekształca datę i czas, podane w postaci łańcucha znaków,

na datownik; ma dwa argumenty: pierwszym jest łańcuch zawierający datę i czas, drugim, opcjonalnym, jest datownik :strtotime ($time, [$timestamp]);

• Umożliwia (m.in.) przekształcenie datownika uzyskanego z bazy danych na datownik PHP, który następnie można przekształcić do potrzebnej postaci funkcjami date() lub strftime():$sql = "SELECT * FROM …";$res = $conn->query ($sql);$row = $res->fetch_assoc();$tm = strtotime ($row["pstts"]);// pole pstts typu TIMESTAMP

Page 26: Języki programowania wysokiego poziomucastor.am.gdynia.pl/~pik/prokom/pliki/jp-php-cz5.pdf · •Rozszerzenie nazwy pliku nie jest istotne; niektóre podręczniki zalecają .inc;

PHP

Funkcja strtotime()• Drugi argument jest potrzebny, jeżeli określenie czasu jest

względne, np.:$nextDay = strtotime ("+1 day", $someDay);

jeżeli zostanie pominięty, to czas jest określany względem czasu bieżącego, tj. domyślnie przyjmuje się równy time()

• Funkcja dobrze rozpoznaje rozmaite opisy, oczywiście tylko po angielsku:$tm1 = strtotime ("+1 week 2 days 4 hours);$tm2 = strtotime ("next Thursday ");$tm3 = strtotime ("last Monday ");$tm4 = strtotime ("yesterday");