Kategorie
Uncategorized

Hello world!

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

Kategorie
Uncategorized

Dziwne zachowanie funkcji `header` w PHP

PHP w swojej prostocie i funkcjonalności pozwala na wiele ciekawych rzeczy, bez żadnego wysiłku (niech ktoś spróbuje choćby sprawdzić w ANSI C czy istnieje jakiś plik lub w Assemblerze przejrzeć zawartość katalogu, to naprawdę dostrzeże jak prosty jest PHP).

Ostatnio właśnie zacząłem się bawić jedną z takich super-funkcji PHP – header.

Daje ona niezwykle wiele możliwości. A co robi? Wysyła surowy nagłówek PHP. Pamiętaj, jednak, aby przed wywołaniem funkcji header nie wysłać do przeglądarki żadnego tekstu!

Kilka ciekawszych zastosowań

Ustawianie kodowania:
Bardzo przydatne gdy wysyłasz plik, który nie ma nagłówka HTML. Mi się przydało, gdy generowałem plik z danymi JSON.

header('Content-type: utf-8');

Ustawianie kodowania:

header('Cache-control: no-cache');

Przechodzenie do innej strony:

header('location: http://www.inna_strona.com');

Powoduje to przejście na inną stronę.

Ja stosowałem to w takim przypadku:

if ($jakis_warunek) {
    header('location: strona.php?wynik=sukces');
}

header('location: strona.php?wynik=porazka');

Wg praw logiki, jeśli spełniony jest warunek wykonany zastanie pierwszy „skok”. Jeśli nie, to pierwszy zostanie opuszczony i wykona się drugi „skok”. No właśnie… Nie koniecznie :).

Funkcja header nie kończy działania skryptu. I w powyższym przypadku bardzo prawdopodobne, że owszem jeśli $jakiś_warunek == true to wykona się pierwsza instrukcja. Jednak zdąży się także wykonać i druga…

Jak to obejść?

Pierwszy sposób:

if ($jakis_warunek) {
    header('location: strona.php?wynik=sukces');
} else {
    header('location: strona.php?wynik=porazka');
}

Choć nadal nie jest idealny.

Poprawmy go jeszcze

if ($jakis_warunek) {
    header('location: strona.php?wynik=sukces');
    exit();
} else {
    header('location: strona.php?wynik=porazka');
    exit();
}

Użyłem tu funkcji `exit’ która bezwarunkowo kończy skrypt. Polecam stosowanie takiego siłowego rozwiązania przy stosowaniu header()… Ja straciłem kilka godzin szukając błędów, w całkiem już sporym systemie 😛

Istnieje także inna funkcja, o podobnym działaniu jak exit. jest to funkcja die. Odsyłam do manuala.

Warto też pamiętać, że jest to jedno z najlepszych rozwiązań patrząc pod kątem SEO.

Kategorie
Uncategorized

Przekierowania ze strony

Często zdarza się, że chcielibyśmy mieć możliwość zrobienia przekierowania z naszej stron na inną. Spróbuję pokazać 3 możliwe rozwiązania, a także krótko opisać pozytywne i negatywne aspekty tychże podejść.

Rozwiązania

  • wykorzystujące meta tag HTML
  • javascript
  • PHP
Kategorie
Uncategorized

Hierarchia klas wyjątków

Link do archiwalnego artykułu:

http://web.archive.org/web/20190814181841/http://yarpo.pl/2010/11/29/hierarchia-klas-wyjatkow/

Kategorie
Uncategorized

Książka „Debugowanie jak wyszukiwać i naprawiać błędy w kodzie oraz im zapobiegać”

Link do archiwalnej kopii recenzji:

http://web.archive.org/web/20170701042134/http://www.yarpo.pl/2010/11/28/ksiazka-debugowanie-jak-wyszukiwac-i-naprawiac-bledy-w-kodzie-oraz-im-zapobiegac/

Link do recenzji na oficjalnej stronie helionu:

https://helion.pl/ksiazki/debugowanie-jak-wyszukiwac-i-naprawiac-bledy-w-kodzie-oraz-im-zapobiegac-paul-butcher,debugo.htm#format/d

Kategorie
Uncategorized

Pseudo przestrzenie nazw w PHP

Archiwalna kopia do artykułu:

http://web.archive.org/web/20200108063942/http://yarpo.pl/2010/11/27/pseudo-przestrzenie-nazw-w-php/

Kategorie
Uncategorized

Wyjątki w PHP 5

Archiwalna kopia artykułu:

http://web.archive.org/web/20170724153915/http://www.yarpo.pl/2010/11/27/wyjatki-w-php-5/

Kategorie
Uncategorized

Autoloader w PHP 5

Chyba nie muszę nikogo przekonywać do tego, że warto jest podzielić kod na logiczne moduły, zamiast umieszczać wszystkiego w jednym pliku. Później można za pomocą funkcji require_once / include_once załączyć jedynie potrzebne skrypty i z tych cegiełek budować nasz system. Niestety takie rozwiązanie, prócz niezaprzeczalnych plusów, ma też minusy. W tym artykule postaram się pokazać jak owe minusy zniwelować.

Nim zaczniesz warto

  • wiedzieć cokolwiek o obiektowym PHP 5
  • posiadać serwer www (może być lokalny, np. Wamp)
  • mieć jakieś 5-10 minut

Przykład “brzydkiego” kodu

require_once 'pliki/klasa1.php'
require_once 'pliki/klasa2.php'
require_once 'pliki/klasa3.php'
require_once 'pliki/klasa4.php'
require_once 'pliki/klasa5.php'

Wady powyższego kodu

  1. Nie jest powiedziane, że wszystkie klasy będą w ogóle wykorzystane (jednak lepiej jest wszystkie require trzymać razem, niż rozsiać je po kodzie). A więc część niepotrzebnie zwalnia pracę bezcelowo się ładując.
  2. Na początku skryptu mamy wiele linii kodu, które tak naprawdę niewiele robią.
  3. Dodając następne klasy musimy pamiętać o odpowiednim zaincludowaniu ich [także o kolejności includowania w przypadku dziedziczenia itp.].

Rozwiązanie

Starczy jedynie użyć ciekawej funkcji PHP – autoload. Spójrz na prosty przykład:

function __autoload($className) {
    echo $className;
}

$obj  = new MyClass1(); // wyświetli "MyClass1"
$obj2 = new MyClass2(); // wyświetli "MyClass2"

Skoro możemy wyświetlić nazwę klasy, to czemu nie wykorzystać tego do załączenia plików z klasami! Starczy jedynie używać odpowiednich nazw.

function __autoload($className) {
    echo $className;
}

Tym sposobem możemy załączyć wszystkie potrzebne pliki. Oczywiście w folderze ‘pliki’ powinny się znajdować pliki ‘klasa1.php’, ‘klasa2.php’, …, ‘klasa5.php’. I w tych plikach powinny znajdować się deklaracje odpowiednich klas.

Poprawki

Każdy kod na początku nie jest idealny, choć często działa. Warto jednak tu zabezpieczyć sie przed jednym bardzo niebezpiecznym zjawiskiem – możliwością wywołania klasy, która nie istnieje. Warto zastosować bardzo prostą w użyciu funkcję file_exists.

function __autoload($className) {
    $path = 'pliki/'.$className. '.php';

    require_once $path;
}

$obj1  = new klasa1();

Załóżmy teraz, że nie będzie pliku ‘pliki/klasa1.php’. Co wtedy? Oczywiście powstanie błąd. Warto się przed tym zabezpieczyć:

function __autoload($className) {
    $path = 'pliki/'.$className. '.php';

    if (file_exists($path)) {
        require_once $path;
    } else {
       // rzuć wyjątek
       // zaloguj błąd
       // wyślij mejla - cokolwiek uważasz za słuszne
    }
}

$obj1  = new klasa1();

Takie wydawałoby się oczywiste i banalne zabezpieczenie pozwala nam uniknąć sytuacji, które mogą narazić nas na spore straty (od kwestii finansowych, przez zawieszenie systemu, po bezpieczeństwo i prestiż).

Co dalej

Skoro już potrafimy ładować automatycznie pliki, to warto teraz nauczyć się jak odpowiednio je przetrzymywać, aby jeszcze przyjemniej móc zarządzać naszym kodem. Ale to już jest temat na inny artykuł nt. pseudo – przestrzeni nazw w PHP < 5.3.3. W Najnowszych wersjach PHP istnieją już mechanizmy wspierające zwykłe przestrzenie nazw.

Kategorie
Uncategorized

Darmowe warsztaty programistyczne dla uczniów z Trójmiasta

Mam przyjemność zaprosić wszystkich chętnych na darmowe warsztaty programistyczne o nazwie Akademia Szybkiego Startu, organizowane przez redaktorów youthcoders.net w ramach Inicjatywy CrEuro.

Więc informacji o warsztatach na oficjalnej stronie: youthcoders.net/blog/wpisy/824-akademia-szybkiego-startu.html

Kategorie
Uncategorized

Książka „Mocne strony JavaScript”

Mocne strony JavaScript

To, że Javascript jest w tej chwili jednym z najpopularniejszych języków programistycznych świata – rzecz oczywista. To, że każdy kto chce tworzyć nowoczesne strony www wcześniej czy później JS nauczyć się musi – rzecz pewna. To, że JavaScript jest najbardziej niezrozumianym (SIC!) językiem świata – rzecz, którą warto zrozumieć.