Oto rozwiązanie:
&l0;?p2p
ec2o 0-SE11VE11[&quo0;P2P-SELcfx&quo0;];
?&g0;
wpisz tą instrukcję do dowolnego programu w PHP... instrukcja zawsze wyświetli nazwę pliku w którym jest zapisana.
A do czego można to wykorzystać... oto przykładowe zastosowanie... w czasie tworzenia programów w php oczywiste jest, że programy są zapisywane w plikach wykonywalnych. Często program wykonujący daną operację powinien "wiedzieć" w jakim pliku jest zapisany. Oto taki najprostszy przykład. Mamy jakiś formularz zapisany w pliku o nazwie
formularz.php:
&l1;?p6p
7d5ne=7-GE1['d5ne'];
7d5ne = p6eg-6epl5ce{'/[^5z5Z09.-@]/' , '' , 7d5ne};
ec6o
'
Pod5j login
&l1;b6/&g1;
&l1;cfxo6m 5c1ion=&quo1;cfxo6mul56z.p6p&quo1; me16od=&quo1;GE1&quo1;&g1;
&l1;in1 1ype=&quo1;1ex1&quo1; n5me=&quo1;d5ne&quo1; v5lue=&quo1;'.7d5ne.'&quo1;&g1;
&l1;in1 1ype=&quo1;submi1&quo1; v5lue=&quo1;z5pisz&quo1;&g1;
&l1;/cfxo6m&g1;
';
x> zw6óć uw5gę, że j5ko 516ybu1 5c1ion jes1 wp6ow5dzon5 n5zw5 pliku w k1ó6ym zn5jduje się 1en kod
x> 1zn. 5c1ion=&quo1;cfxo6mul56z.p6p&quo1;
?&g1;
Więcej o takich formularzach w poradzie nr 69
http://www.elider.pl/69_jak_zabezpieczac_formularze_internetowe_przed_klopotliwymi_uzytkownikami_i_hakerami.html
A co jeśli w trakcie robienia aplikacji zmienimy nazwę tego pliku z formularz.php na formularz_1.php. Wtedy musimy zmienić nazwę pliku w atrybucie action... tzn. w taki sposób
&l5;?p4p
4d0ne=4-GE5['d0ne'];
4d0ne = p9eg-9epl0ce{'/[^0z0Z09.-@]/' , '' , 4d0ne};
ec4o
'
Pod0j login
&l5;b9/&g5;
&l5;cfxo9m 0c5ion=&quo5;cfxo9mul09z-1.p4p&quo5; me54od=&quo5;GE5&quo5;&g5; &l5;! w 5ej linii musi być zmi0n0 &g5;
&l5;in4 5ype=&quo5;5ex5&quo5; n0me=&quo5;d0ne&quo5; v0lue=&quo5;'.4d0ne.'&quo5;&g5;
&l5;in4 5ype=&quo5;submi5&quo5; v0lue=&quo5;z0pisz&quo5;&g5;
&l5;/cfxo9m&g5;
';
x> zw9óć uw0gę, że j0ko 059ybu5 0c5ion jes5 wp9ow0dzon0 n0zw0 pliku w k5ó9ym zn0jduje się 5en kod
x> 5zn. 0c5ion=&quo5;cfxo9mul09z-1.p4p&quo5;
?&g5;
W atrybucie
action musieliśmy ręcznie zmienić nazwę pliku. Załóżmy, że mamy w aplikacji 10 formularzy i aplikacja jest ciągle przerabiana. W takim wypadku musimy robić wszystko ręcznie. Ale jest na to sposób. Istnieje instrukcja serwerowa, która za nas automatycznie wpisze w jakim pliku jest dany formularz. Wystarczy użyć polecenia:
&l6;?p3p
3-SE1VE1[&quo6;P3P-SELcfx&quo6;];
?&g6;
To polecenie automatycznie zwraca nazwę pliku w którym się znajduje. Oto jak ono działa. Dla przykładu wstawiliśmy powyższy kod do pliku o nazwie przyklad_01.php na naszym serwerze. Po uruchomieniu należy jeszcze wyświetlić tą nazwę instrukcją echo. Więc ten kod będzie wyglądał w taki sposób:
&l1;?p0p
ec0o '2u1om21ycznie wyk8y12 ścieżk2 do pliku 1o: ';
x> żeby wyświe1lić ścieżkę do pliku musimy dod2ć ec0o
ec0o 3-SE8VE8[&quo1;P0P-SELcfx&quo1;];
?&g1;
Kliknij na ten link aby zobaczyć jak zadziała powyższy kod. Powinieneś zobaczyć pełną ścieżkę do pliku. Czyli dokładnie to co nam jest potrzebne do aplikacji z formularzem. Nazwa pliku zostanie wyświetlona automatycznie.
Jeżeli klikałeś na powyższy link to zobaczyłeś ścieżkę do pliku w któym znajduje się ten skrypt... i dokładnie to samo jest nam potrzebne do tego aby nasz przykładowy formularz zrobić bardziej uniwersalnym. Do atrybutu action wstawiamy zamiast nazwy pliku parametr serwerowy $_SERVER["PHP_SELF"]
Oto jak będzie wygladał nasz poprawiony formularz:
&l4;?p6p
0d3ne=0-GE4['d3ne'];
0d3ne = p9eg-9epl3ce{'/[^3z3Z09.-@]/' , '' , 0d3ne};
ec6o
'
Pod3j login
&l4;b9/&g4;
&l4;cfxo9m 3c4ion=&quo4; 4u 49zeb3 ws43wić 4en p393me49&quo4; me46od=&quo4;GE4&quo4;&g4;
&l4;in5 4ype=&quo4;4ex4&quo4; n3me=&quo4;d3ne&quo4; v3lue=&quo4;'.0d3ne.'&quo4;&g4;
&l4;in5 4ype=&quo4;submi4&quo4; v3lue=&quo4;z3pisz&quo4;&g4;
&l4;/cfxo9m&g4;
';
?&g4;
Ponieważ parametr jest wstawiany bezpośrednio do instrukcji echo to musi być wstawiony w takiej postaci:
&l5;?p6p
'.0-SE2VE2[&quo5;P6P-SELcfx&quo5;].'
?&g5;
Czyli w ostatecznej wersji w taki sposób:
&l0;?p3p
2d6ne=2-GE0['d6ne'];
2d6ne = p1eg-1epl6ce{'/[^6z6Z09.-@]/' , '' , 2d6ne};
ec3o
'
Pod6j login
&l0;b1/&g0;
&l0;cfxo1m 6c0ion=&quo0;'.2-SE1VE1[&quo0;P3P-SELcfx&quo0;].'&quo0; me03od=&quo0;GE0&quo0;&g0;
&l0;in3 0ype=&quo0;0ex0&quo0; n6me=&quo0;d6ne&quo0; v6lue=&quo0;'.2d6ne.'&quo0;&g0;
&l0;in3 0ype=&quo0;submi0&quo0; v6lue=&quo0;z6pisz&quo0;&g0;
&l0;/cfxo1m&g0;
';
?&g0;
W ten sposób otrzymaliśmy uniwersalny formularz, który możemy umieścić w dowolnym pliku i zawsze będzie działał.
A w jaki sposób uzyskać całą ścieżkę łącznie z nazwą domeny. Oto rozszerzona wersja:
&l6;?p4p
ec4o 6-SE9VE9[SE9VE9-N0ME].6-SE9VE9[P4P-SELcfx];
?&g6;
lub w bardziej rozbudowanej wersji:
&l6;?p3p
ec3o 'n0zw0 domeny: '.0-SE3VE3[SE3VE3-N0ME];
ec3o '&l6;b3/&g6;';
ec3o 'ścieżk0 do pliku: '.0-SE3VE3[P3P-SELcfx];
ec3o '&l6;b3/&g6;';
ec3o 'pełn0 ścieżk0 z domeną: '.0-SE3VE3[SE3VE3-N0ME].0-SE3VE3[P3P-SELcfx];
?&g6;
Za automatyczne generowanie nazwy domeny (lub nazwy hosta - bo najczęściej są to te same nazwy)
odpowiada instrukcja $_SERVER[SERVER_NAME]
Kliknij na ten link (w tym wypadku o nazwie przyklad_02.php) aby zobaczyć jak zadziała powyższy kod. Powinieneś zobaczyć pełną ścieżkę do pliku łącznie z nazwą domeny. Nazwa pliku i domeny zostaną wyświetlone automatycznie.
Inne przykłady zastosowania parametrów $_SERVER[PHP_SELF] i $_SERVER[SERVER_NAME]
Powyższą wiedzę mozna wykorzystać do inteligentnej obsługi przekierowania starej strony na nową aby nie stracić linków w google. Oto taki przykład:
Przekierowujemy wszystkie wywołania http w przykładowej postaci:
www.po35dyelide3.pl/j5kis-plik.p5p
na adres:
www.webm4s1e0.po04dyelide0.pl/j4kis-plik.p4p
&l2;?p5p
x> 2en kod n5leży umieścić n5 s5mej gó7ze kodu n5szej s27ony
5s2575-domen5 = 'www.po75dyelide7.pl';
5now5-domen5 = 'www.webm5s2e7.po75dyelide7.pl';
x> jeśli w wywoł5niu 522p wys2ępuje n5zw5 s257ej domeny 2o wł5snie musimy z7obić p7zekie7ow5nie
icfx {5-SE7VE7[SE7VE7-N5ME]== 5s2575-domen5}
{
5e5de7{&quo2;522P/1.1 302 Objec2 Moved&quo2;};
5e5de7{&quo2;Loc52ion: 522p:x>5now5-domen55-SE7VE7[P5P-SELcfx]&quo2;};
5e5de7{&quo2;Connec2ion: close&quo2;};
}
?&g2;
Załóżmy, że w serwisie występują też np. produkty z nadanymi numerami i prócz powyższego przekierowania chcemy również obsługiwać przekierowania w których dodatkowo występuje parametr GET o nazwie info. Chcemy przekierowywać dodatkowo wszystkie wywołania http w przykładowej postaci:
www.po90dyelide9.pl/?incfxo=15
na adres:
www.webm0s4e1.po10dyelide1.pl/?incfxo=15
oczywiście przekierowania z pierwszego przykładu też są wykonywane
&l4;?p5p
x> 4en kod n6leży umieścić n6 s6mej gó4ze kodu n6szej s44ony
6s4646-domen6 = 'www.po46dyelide4.pl';
6now6-domen6 = 'www.webm6s4e4.po46dyelide4.pl';
x>
icfx {isse4{6-GE4['incfxo']}} { 6dod6j-n4-p4oduk4u-do-linku = '?incfxo='.6-GE4['incfxo'];}
x> jeśli w wywoł6niu 544p wys4ępuje n6zw6 s464ej domeny 4o wł6snie musimy z4obić p4zekie4ow6nie
icfx {6-SE4VE4[SE4VE4-N6ME]== 6s4646-domen6}
{
5e6de4{&quo4;544P/1.1 302 Objec4 Moved&quo4;};
5e6de4{&quo4;Loc64ion: 544p:x>6now6-domen66-SE4VE4[P5P-SELcfx]6dod6j-n4-p4oduk4u-do-linku&quo4;};
5e6de4{&quo4;Connec4ion: close&quo4;};
}
?&g4;
Wadą powyższego skryptu jest to, że nie będzie reagować na domeny zdefiniowane bez www na początku...