PHP: Usuwanie z adresu wybranego parametru typu GET

2012-07-25 PHP

Załóżmy, że pracujemy z aplikacją w PHP, której działanie i zachowanie opiera się w pewnym stopniu na zmiennych otrzymanych jako parametry na pasku adresu. Może zajść potrzeba, że będziemy potrzebowali adresu uszczuplonego o przykładowy parametr. Poniższy artykuł pokaże jak można przefiltrować długi adres z parametrami i przefiltrować go z niepożądanych elementów.

Powiedzmy, że mamy hipotetyczną aplikację pod adresem:

http://localhost/index.php?id=dzial&sub=poddzial&akcja=pokaz_produkty&wyszukiwarka=tak&ile_produktow=25&tylko_ze_zdjeciem=tak

Adres został całkowicie wymyślony ale po jego interpretacji możemy wywnioskować, że mamy wyświetlone przez wyszukiwarkę 25 produktów posiadających zdjęcie w kategorii o nazwie "Poddział", która jest podrzędną kategorii "Dział" – czysta abstrakcja.

Zakładamy, że aplikacja wyświetla wyszukiwarkę w momencie kiedy parametr (zmienna) "wyszukiwarka" ma ustawioną wartość "tak". Usunięcie tej zmiennej lub zmiana "tak" na cokolwiek innego sprawi, że wyszukiwarka zniknie. Chcemy właśnie taki efekt uzyskać.

Oczywiście jeśli znamy wszystkie zmienne to możemy zbudować na nowo adres stawiając po kolei zmienne:

  • id=dzial,
  • sub=poddzial,
  • akcja=pokaz_produkty,
  • wyszukiwarka=nie,
  • ile_produktow=25,
  • tylko_ze_zdjeciem=tak

i przechodząc na taki adres. Jednak budowanie adresu podając wszystkie zmienne w kodzie PHP jest uciążliwe i nieskalowalne. Czy przewidzieliśmy co się stanie jeśli jednak nie znamy wszystkich zmiennych? A co jak nazwa ma być inna? Będziemy edytować pliki?

Nasz kod "zeskanuje" cały, długi adres (bez względu na ilość parametrów i ich kształt). Następnie spróbuje odnaleźć zmienną, która nas interesuje. Jeśli ją znajdzie to usunie ją z adresu, przebuduje cały ciąg parametrów i przekieruje nas na nowo stworzony adres.

Pobieramy nasz długi adres z przeglądarki i przepuszczamy przez funkcję parse_url():

$urlParsed = parse_url($_SERVER['REQUEST_URI']);
var_dump($urlParsed);

Funkcja var_dump() zwróci nam tablicę:

array(2) { 
  ["path"]=> 
  string(10) "/index.php" 
  ["query"]=> 
  string(98) "id=dzial&sub=poddzial&akcja=pokaz_produkty&wyszukiwarka=tak&ile_produktow=25&tylko_ze_zdjeciem=tak" 
}

Interesuje nas element "query", który zawiera wszystkie parametry. Jako, że jest to łańcuch znaków – przypiszmy go do zmiennej:

$urlQuery = parse_str($urlParsed['query'], $urlOutput);

Funkcja parse_str() stworzyła nam tablicę z podanego ciągu i zapisała do zmiennej $urlOutput. Kiedy przepuścimy ją przez var_dump() to otrzymamy tablicę składającą się z 6 elementów:

array(6) {
  ["id"]=>
  string(5) "dzial"
  ["sub"]=>
  string(8) "poddzial"
  ["akcja"]=>
  string(14) "pokaz_produkty"
  ["wyszukiwarka"]=>
  string(3) "tak"
  ["ile_produktow"]=>
  string(2) "25"
  ["tylko_ze_zdjeciem"]=>
  string(3) "tak"
}

Teraz każdy parametr to osobny element tablicy. Usuwanie elementów tablicy odbywa się poprzez skorzystanie z funkcji unset():

unset($urlOutput['wyszukiwarka']);

Tablica zmniejszy się o usunięty element:

array(5) {
  ["id"]=>
  string(5) "dzial"
  ["sub"]=>
  string(8) "poddzial"
  ["akcja"]=>
  string(14) "pokaz_produkty"
  ["ile_produktow"]=>
  string(2) "25"
  ["tylko_ze_zdjeciem"]=>
  string(3) "tak"
}

Teraz wykonajmy czynność odwrotną – z podanej tablicy zbudujmy adres:

$urlNew = '/index.php?'.http_build_query($urlOutput, '', '&');
var_dump($urlNew);

Otrzymaliśmy nowy łańcuch znaków dzięki funkcji http_build_query():

string(108) "/index.php?id=dzial&sub=poddzial&akcja=pokaz_produkty&ile_produktow=25&tylko_ze_zdjeciem=tak"

Od teraz dysponujemy nowym adresem pod którym formularza wyszukiwarki nie ma.

Do NOT follow this link or you will be banned from the site!