Ok, więc:
$_SERVER[DOCUMENT_ROOT]
W tablicach, jeżeli klucz nie jest cyfrą (czyli np. $tab[0]
) tylko stringiem - podawaj cudzysłowy! Dlaczego? Otóż w PHP jest coś takiego jak STAŁE. Stałe to takie prawie zmienne, tylko, że zapisuje się w nich tylko ciąg znaków/liczby/albo true lub false. Stałe - zgodnie z nazwą definiuje się RAZ, na stałe. Zapisuje się je jako litery, bez znaku dolara, po prostu słowa. I teraz:
Załóżmy, że definiujesz sobie stałe:
define("login", "root");
define("pass", "root");
define("db", "4programmers");
Przechowujesz sobie w nich dane do logowania do bazy danych. Przypominam, że odwołanie do stałych to po prostu ich nazwa, bez żadnych ekstra symboli (jak $
przy zmiennych), więc taki zapis:
$_GET[login]
spowoduje, że PHP zrozumie słowo login
NIE jako klucz tablicy - weźmie wartość stałej, która brzmi root
i w efekcie odczyta $_GET['root']
- co będzie nieoczekiwane. PHP niestety zbyt często stara się być mądrzejsze od użytkownika dlatego pozwala na brak cudzysłowiów przy odwoływaniu się do tablicy - wtedy jeżeli stała nie jest zdefiniowana - potraktuje Twoje literki jako ciąg znaków [i wygeneruje ostrzeżenie].
Dla Ciebie pewnie brzmi niegroźnie, ale - korzystając z jakichś bibliotek - może się okazać, że jakaś definiowała stałe - i wtedy Twój skrypt "nie wiadomo dlaczego" by się posypał.
Teraz kwestia ostrzeżeń i isset
- PHP generuje ostrzeżenia i błędy na wielu "poziomach". Domyślnie serwery są ustawiane tak, że "małe" problemy są ignorowane po cichu (np. odwołanie się do nieistniejącej zmiennej) - tu znowu PHP jest mądrzejsze od użytkownika, bo czegoś takiego nie zrobisz w "poważnych" językach programowania - choć ja osobiście to lubię. Ale trzeba być świadomym wszystkich magicznych "ulepszeń" PHP przy pisaniu, bo można się zdziwić.
Za poziom (rodzaj) wyświetlania błędów odpowiada ustawienie error_reporting
w php.ini
. Zazwyczaj jest ono ustawione na:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
, bądź error_reporting = E_ALL & ~E_NOTICE
U Ciebie jest teraz na error_reporting = E_ALL
więc wyświetla Ci wszystkie błędy i ostrzeżenia, nawet te najmniejsze. Z jednej strony - E_ALL
pozwala Ci pisać kod naprawdę dobrze, z drugiej strony zazwyczaj wystarczy dołączyć jakąś bibliotekę i okazuje się, że inni się nie przejmowali takimi sprawami i plan, żeby Twoja strona działała normalnie z E_ALL odpada.
Swoją drogą - na serwerach publicznych WSZYSTKIE błędy powinny być ukryte - często wg opisu takiego błędu można być w stanie odnaleźć jakąś dziurę i przy jej pomocy - coś napsuć. Na domowym serwerze, na którym sobie piszesz - użyj jednej z podanych wyżej wartości.
Skróty typu <?="test"?>
nie działają ze względu na ustawienie short_open_tag = Off
. Pownieneś to tak zostawić, a wszelkie dołączone biblioteki używające short_open_tags
samodzielnie poprawić. Dlaczego tak?
Opcja ta istnieje dziś ze względu na kompatybilność ze starymi skryptami, ale zaleca się jej wyłączenie zarówno na serwerach publicznych jak i domowych. Jaki jest powód? Tagów <?
używa wiele języków, w tym popularny XML - więc serwer mógłby być zmylony i zacząć probówać parsować zły kod jako PHP - i się na tym wyłożyć po prostu.