Zmienne superglobalne w PHP

Zmienne superglobalne

Podobnie jak superbohaterowie, zmienne superglobalne również posiadają swoje super moce.

Są one zawsze dostępne, w dowolnym kontekście, we wszystkich twoich plikach.

Poza supermocami, mają też supernazwy. Każda z nich nazywa się podobnie, zobacz pełną listę poniżej:

$_SERVER
$_GET
$_POST
$_FILES
$_COOKIE
$_SESSION
$_REQUEST
$_ENV

Dlaczego w ogóle wspominam o zmiennych superglobalnych?

Ponieważ z ich pomocą uzyskujemy dostęp do bardzo cennych informacji.

Zmienne superglobalne a dane z formularza HTML

Do tego momentu, w ramach podstawowego kursu PHP, nie kontaktowaliśmy się z użytkownikiem w żadnej formie.

Zrobiliśmy tylko trochę magii po stronie serwera, dodaliśmy pętle, warunki i zmienne, a na końcu stworzyliśmy dokument HTML. Ale co z odczytaniem danych wejściowych od użytkownika?

Internet poszedł tak bardzo do przodu przez ostatnie kilkadziesiąt lat, że strony już dawno przestały pełnić rolę jedynie wirtualnej ulotki z podstawowymi danymi firmy.

Dziś rozbudowane aplikacje webowe zachęcają do dwustronnej komunikacji między użytkownikiem a stroną WWW.

Pierwszą rzeczą, którą musisz poznać, są właśnie zmienne superglobalne.

To one pozwolą Ci zbierać informacje od odwiedzających i przetwarzać je dalej po stronie serwera.

Przede wszystkim, mam na myśli $_POST i $_GET.

Wszystkie dane przesłane z formularzem HTML są tutaj przechowywane. Formularz HTML to pierwsza i główna metoda gromadzenia informacji od użytkownika.

Zobaczmy przykład:

<form method="post" action="plik.php">
  <input type="text" name="firstName" />
  <input type="text" name="lastName" />
  <input type="email" name="email" />
  <input type="password" name="password" />
  <input type="submit" value="Wyślij" />
</form>

Zakładam, że podstawy HTML nie są Ci obce. Jednak wyjaśnijmy szybko, jak zadziała powyższy kod.

Wyświetli on listę czterech pól typu input, które użytkownicy będą mogli wypełnić podczas odwiedzania Twojej strony. Oprócz tego, zobaczą przycisk „Wyślij”. Za jego pomocą mogą przesłać dane na nasz serwer.

Tag formularza ma dwa atrybuty: metodę i akcję (method i action).

Metoda opisuje sposób wysyłania danych, a akcja decyduje o miejscu ich wysłania.

Oznacza to, że dane są wysyłane do pliku o nazwie plik.php za pomocą metody POST.

Zobacz teraz, jak możemy odczytać dane w naszym pliku plik.php:

<?php
// plik.php

$firstName = $_POST['firstName'];
$lastName = $_POST['lastName'];
$email = $_POST['email'];
$password = $_POST['password'];

echo "Nowa osoba: $firstName $lastName, z mailem: $email właśnie założyła konto";

Każde pole wejściowe wysłane z formularzem HTML jest dostępne pod kluczem ze swoją nazwą w zmiennej superglobalnej (w naszym przypadku $_POST, bo wysyłaliśmy formularz metodą POST). Jest to tablica asocjacyjna, która zawiera wszystkie wysłane pola.

Możesz (i powinieneś) sprawdzić daną zmienną superglobalną, czy jest pusta i czy zawiera dany klucz. Możesz do tego wykorzystać metody empty oraz isset.

Nie będę się tutaj rozwodził nad ich działaniem, więc mówiąc prosto: empty() sprawdza, czy wartość zmiennej jest pusta (zwraca wartość true, jeśli jest zmienna nie istnieje, jej wartość jest zerowa (null, 0), lub jest pustą tablicą bez żadnych rekordów), podczas gdy isset() sprawdza, czy zmienna została zainicjalizowana bez sprawdzania jej wartości (zmienna istnieje, ale nadal mogła nie zostać przypisana).

Najlepiej będzie, jak zobrazuję Ci to na poniższym przykładzie:

<?php
// plik.php

if (!empty($_POST))
{
  if (isset($_POST['firstName']))
  {
    $firstName = $_POST['firstName'];
  }

// itd.
}

Wtedy masz pewność, że zmienna $_POST zawiera jakieś wpisy.

Następnie możesz sprawdzić, czy konkretny wpis istnieje, i dopiero wtedy odczytać jego wartość.

Powinieneś też dołożyć trochę kontroli i walidacji, aby upewnić się, że twój skrypt jest bezpieczny. Sprawdź linka, by dowiedzieć się więcej na ten temat. To, jakie zabezpieczenia musisz wprowadzić, zależy od przeznaczenia wprowadzanych danych.

Reszta superglobali

$_FILES zawiera wszystkie pliki wysłane wraz z formularzem.

Jest to przydatna zmienna, gdy użytkownik chce przesłać pliki (takie jak zdjęcia, raporty, muzykę itp.) jako dodatek do wysyłanego formularza HTML (input typu file). Wszystkie pliki przesłane w ten sposób są przechowywane w zmiennej superglobalnej $_FILES.

Możesz uzyskać do nich dostęp w taki sam sposób, jak w przypadku pól $_POST. Wystarczy odwołać się po nazwie pola formularza do indeksu $_FILES.

$_SESSION przechowuje wszystkie wartości odpowiednie dla bieżącej sesji użytkownika.

Służy to przede wszystkim do rozpoznania, czy użytkownik jest zalogowany. Po akcji zalogowania dodawana jest zmienna sesyjna określająca zalogowanego użytkownika i jej obecność decyduje o ważności logowania.

Może też służyć do stwierdzenia, czy sesja jest nadal ważna. Dodatkowo, może przechowywać dane kontekstowe użytkownika.

$_SESSION jest również powszechnie stosowana do implementacji funkcjonalności koszyka zakupowego.

$_COOKIE przechowuje wszystkie pliki cookie dla naszej witryny.

Jeśli zapiszesz ciasteczko na komputerze odwiedzającego, znajdziesz je w tej superglobalnej tablicy.

$_ENV zachowuje konfigurację środowiska.

Te parametry są zwykle ustawiane poza główną aplikacją przez czynniki zewnętrzne (takie jak pliki konfiguracyjne, rozpoznawane przez serwer WWW). Następnie w aplikacji możesz odczytać je z tych zmiennych superglobalnych.

$_SERVER zawiera wiele informacji o serwerze, na którym wykonywane są skrypty.

Zerknij na przykładową odpowiedź z mojego lokalnego serwera PHP, uruchomionego bezpośrednio z Visual Studio Code na MacBooku PRO:

array(34) {
  ["MANPATH"]=>
  string(417) "/Users/marcin(...)/usr/share/man"
  ["TERM_PROGRAM"]=>
  string(6) "vscode"
  ["NVM_CD_FLAGS"]=>
  string(0) ""
  ["TERM"]=>
  string(14) "xterm-256color"
  ["SHELL"]=>
  string(9) "/bin/bash"
  ["TMPDIR"]=>
  string(49) "/var/folders/f4/b21z(...)pmm0000gn/T/"
  ["Apple_PubSub_Socket_Render"]=>
  string(48) "/private/tmp/com.apple.launchd.nNgCpZNpJN/Render"
  ["TERM_PROGRAM_VERSION"]=>
  string(6) "1.38.1"
  ["NVM_DIR"]=>
  string(23) "/Users/marcin/.nvm"
  ["USER"]=>
  string(11) "marcin"
  ["SSH_AUTH_SOCK"]=>
  string(51) "/private/tmp/com.apple.launchd.nU5lv7KhPr/Listeners"
  ["__CF_USER_TEXT_ENCODING"]=>
  string(15) "0x1F5:0x1D:0x2A"
  ["PATH"]=>
  string(263) "/Users/marcin/.nvm/versions/(...)path-bin"
  ["NVM_NODEJS_ORG_MIRROR"]=>
  string(23) "https://nodejs.org/dist"
  ["PWD"]=>
  string(51) "/Users/marcin/Documents/source/phpdemo"
  ["LANG"]=>
  string(11) "pl_PL.UTF-8"
  ["XPC_FLAGS"]=>
  string(3) "0x0"
  ["XPC_SERVICE_NAME"]=>
  string(1) "0"
  ["SHLVL"]=>
  string(1) "2"
  ["HOME"]=>
  string(18) "/Users/marcin"
  ["LOGNAME"]=>
  string(11) "marcin"
  ["NVM_BIN"]=>
  string(49) "/Users/marcin/.nvm/versions/node/v6.10.2/bin"
  ["NVM_IOJS_ORG_MIRROR"]=>
  string(21) "https://iojs.org/dist"
  ["COLORTERM"]=>
  string(9) "truecolor"
  ["_"]=>
  string(18) "/usr/local/bin/php"
  ["PHP_SELF"]=>
  string(8) "test.php"
  ["SCRIPT_NAME"]=>
  string(8) "test.php"
  ["SCRIPT_FILENAME"]=>
  string(8) "test.php"
  ["PATH_TRANSLATED"]=>
  string(8) "test.php"
  ["DOCUMENT_ROOT"]=>
  string(0) ""
  ["REQUEST_TIME_FLOAT"]=>
  float(1574084436.3791)
  ["REQUEST_TIME"]=>
  int(1574084436)
  ["argv"]=>
  array(1) {
    [0]=>
    string(8) "test.php"
  }
  ["argc"]=>
  int(1)
}

Jak widać, jest tutaj wiele informacji.

Możesz zobaczyć skrypty, dokumenty, katalogi główne, moment wywołania zapytania, informacje o użytkowniku itp.

Na serwerach internetowych można również zobaczyć adres IP i dane związane z konkretnym zapytaniem od klienta (typ i wersja przeglądarek, port, metoda HTTP itp.).

Korzystamy z niego bardzo szeroko w budowaniu praktycznego projektu w książce Praktyczne PHP.

$_REQUEST to zestaw trzech zmiennych: $_GET, $_POST i $_COOKIE.

Dane zawarte w tych trzech tablicach będą również obecne w $_REQUEST.

To już wszystkie zmienne superglobalne, podsumujmy

Zmienne superglobalne to tablice, które działają jak każda inna tablica. Nazywa się je superglobalnymi, ponieważ możemy uzyskać do nich dostęp z każdego kontekstu bez konieczności jawnego oznaczania ich jako globalnych.

Są dostępne wszędzie bez konieczności ich wcześniejszej inicjalizacji.

To tyle w temacie wprowadzenia do zmiennych superglobalnych.

Teraz chciałbym usłyszeć coś od ciebie.

Czy zmienne superglobalne były dla Ciebie czymś nowym? A może korzystałeś z nich już wcześniej?

Daj mi znać w komentarzu poniżej.