Języki programowania wysokiego poziomu Forum, Blog, Sample DB - wskazówki
Wielokrotne użycie kodu Skrypt 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 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
Wielokrotne użycie kodu Instrukcja include zwykle służy do włączania gotowego, powtarzającego się fragmentu HTML: <?php include "header.php"; include "banner.php"; // zmienne elementy strony include "footer.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 <?php require_once "tepmlate.php"; //template.php <?php $pagetemplate = "...";
Wielokrotne użycie kodu Zabezpieczenie przed wczytaniem pomocniczego skryptu, oparte na własnych zmiennych //index.php <?php define ("INDEX", "1"); // $INDEX = true; require_once "tepmlate.php"; //template.php <?php if (!isset (INDEX)) { header ("Location: index.php"); die (); } // zasadnicza treść skryptu
Wielokrotne użycie kodu Zabezpieczenie przed wczytaniem pomocniczego skryptu, oparte na tablicy sesji (zwykle i tak jest używana) //index.php <?php session_start(); include "tepmlate.php"; //template.php <?php if (!isset ($_SESSION)) { header ("Location: index.php"); die (); } // zasadnicza treść skryptu
Wielokrotne użycie kodu Definiowanie długich łańcuchów tekstu $pagetemplate = " <!DOCTYPE...". "<html>". "<head>"; $pagetemplate = <<<EOM <!DOCTYPE... <html> <head>... EOM;
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");
Argumenty i rezultat funkcji Ponieważ w 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) //
Argumenty domyślne Wiele standardowych funkcji ma argumenty domyślne, można też ich używać we własnych funkcjach function 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.
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
Wielokrotne użycie kodu Powtarzające się w wielu skryptach czynności powinny być wykonywane przez funkcje, wczytywane z pliku // index.php require_once "common.php"; $conn = ConnectDatabase(); // common.php function ConnectDatabase() { $conn = new mysqli ( ); if (mysqli_connect_errno()!=0) { // header??? die (); } $res = $conn->query ("SET NAMES 'utf8'"); return $conn; }
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 Dynamiczne tworzenie w skrypcie tylko elementów zmiennych strony, do zmiennych, np.: $pgbody = "<h2>xxx</h2>"; while (...) $pgbody.= "<p>yyy";
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;
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.
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 pozwala uwzględnić wszystkie te niuanse
Obsługa daty i czasu 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
Znacznik czasu (timestamp) 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 : date() lub strftime()
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
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
Funkcja date() Wybrane znaki formatujące (małe i wielkie litery są rozróżniane) d dzień miesiąca, z wiodącym zerem, 01-31 D dzień tygodnia, w skrócie, Mon Sun m numer miesiąca, z wiodącym zerem, 01-12 M nazwa miesiąca, w skrócie, Jan Dec F 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 h godzina, format 12H, z zerem, 01 12 i minuta, z wiodącym zerem, 00-59 s sekundy, z wiodącym zerem, 00-59
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;
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);
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
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, 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
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");