Zmienne ze źródeł zewnętrznych
Formularze HTML (GET i POST)
Kiedy do skryptu PHP zostanie wysłany formularz, informacja
z niego jest automatycznie dostępna w skrypcie. Istnieje
kilka sposobów na uzyskanie tych informacji, dla przykładu:
Przykład #1 Prosty formularz HTML
<form action="foo.php" method="post">
Imie: <input type="text" name="imie" /><br />
Email: <input type="text" name="email" /><br />
<input type="submit" name="submit" value="Wyslij!" />
</form>
Począwszy od PHP 5.4 istnieją tylko dwie drogi uzyskiwania dostępu do informacji z formularza.
Obecnie dostępne metody zostały wymienione poniżej:
Przykład #2 Dostęp do informacji z prostego formularza HTML (wysłanego metodą POST)
<?php
echo $_POST['imie'];
echo $_REQUEST['imie'];
?>
W starszych wersjach PHP istniało kilka innych metod uzyskiwania dostępu do danych od użytkownika. Zostały
one pokazane poniżej. Spójrz na wykaz zmian na dole strony, aby uzyskać więcej szczegółów.
Przykład #3 Starsze metody pobierania danych od użytkownika
<?php
// UWAŻAJ: te metody NIE są dłużej wspierane.
// Poprawne zostały opisane powyżej
// Używając import_request_variables() - ta funkcja została usunięta w PHP 5.4.0
import_request_variables('p', 'p_');
echo $p_imie;
// Długie zmienne predefiniowane zostały usunięte w PHP 5.4.0
echo $HTTP_POST_VARS['imie'];
// Używając register_globals. Ta możliwość została usunięta w PHP 5.4.0
echo $imie;
?>
Przesyłanie danych z formularza metodą GET jest podobne, z takim wyjątkiem, że użyjesz
zmienną predefiniowaną odpowiednią dla tej metody, zamiast poprzedniej. GET także
odnosi się do tzw. QUERY_STRING (informacje w adresie URL, po znaku '?'). Tak więc,
dla przykładu, http://www.example.com/test.php?id=3
zawiera dane dla metody GET, dostępne poprzez $_GET['id'].
Zobacz także $_REQUEST.
Informacja:
Spacje i kropki w nazwach zmiennych są konwertowane do znaków podkreślenia. Na
przykład <input name="a.b" /> staje się zmienną
$_REQUEST["a_b"].
PHP obsługuje także tablice w kontekście zmiennych z formularzy
(zajrzyj do FAQ). Można
na przykład pogrupować razem powiązane zmienne lub użyć tej
możliwości do pobrania wartości z pola wyboru (select). Na
przykład, wyślijmy formularz z pliku metodą POST do samego siebie
i wyświetlmy te dane:
Przykład #4 Bardziej złożone zmienne w formularzach
<?php
if ($_POST) {
echo '<pre>';
echo htmlspecialchars(print_r($_POST, true));
echo '</pre>';
}
?>
<form action="" method="post">
Nazwisko: <input type="text" name="personal[nazwisko]"><br />
Email: <input type="text" name="personal[email]"><br />
Piwo: <br />
<select multiple name="piwo[]">
<option value="zywiec">Żywiec</option>
<option value="tyskie">Tyskie</option>
<option value="lech">Lech</option>
</select><br />
<input type="submit" value="Wyślij mnie!" />
</form>
Informacja:
Jeżeli zewnętrzna nazwa zmiennej zaczyna się od poprawnej składni tablicy, końcowe
znaki są po cichu ignorowane. Przykładowo <input name="foo[bar]baz">
staje się $_REQUEST['foo']['bar'].
Ciasteczka HTTP
PHP bez problemu obsługuje ciasteczka HTTP, tak jak zdefiniowano w » RFC 6265. Ciasteczka są
mechanizmem przechowywania informacji w przeglądarce klienta w celu
śledzenia lub identyfikowania stałych bywalców strony. Ciasteczka ustawia
się za pomocą funkcji setcookie(). Ciasteczka są częścią
nagłówka HTTP, więc funkcja SetCookie musi być wywołana zanim jakakolwiek
inna informacja zostanie wysłana do przeglądarki. Takie samo ograniczenie
dotyczy funkcji header(). Dane z ciasteczek
są wówczas dostępne w odpowiednich tablicach danych cookies, takich
jak $_COOKIE, jak również $_REQUEST.
Zobacz także stronę dotyczącą funkcji setcookie() aby poznać więcej
informacji i przykładów.
Jeśli chcesz przypisać wiele wartości do jednego ciasteczka, możesz
po prostu złączyć je w tablicę. Na przykład:
Spowoduje to stworzenie dwóch oddzielnych ciasteczek, mimo, iż MojeCiasteczko będzie teraz
pojedynczą tablicą w twoim skrypcie. Jeśli chcesz ustawić tylko jedno ciasteczko
z wieloma wartościami, rozważ możliwość użycia przedtem funkcji serialize()
lub explode() na wartości.
Pamiętaj, że wysłane ciasteczko zastąpi wcześniejsze ciasteczko o tej
nazwie, o ile ścieżka lub domena nie są różne. Na przykład dla koszyka
do zakupów możesz potrzebować licznika a jego wartość stale przekazywać
dalej, tzn.
Przykład #5 Przykład użycia funkcji setcookie()
<?php
if (isset($_COOKIE['ile'])) {
$ile = $_COOKIE['ile'] + 1;
} else {
$ile = 1;
}
setcookie('ile', $ile, time()+3600);
setcookie("Cart[$ile]", $pozycja, time()+3600);
?>
Kropki w nazwach odbieranych zmiennych
PHP normalnie nie zmienia nazw zmiennych podczas
przekazywania ich do skryptu. Jednakże należy pamiętać, że
kropka "." nie jest poprawnym znakiem w
nazwie zmiennej PHP. Dlaczego? Proszę spojrzeć na to:
<?php
$varname.ext; /* niepoprawna nazwa zmiennej */
?>
To co widzi parser, to zmienna o nazwie
$varname, po której pojawia się operator konkatenacji,
a następnie pusty łańcuch (czyli taki, który
nie jest żadnym słowem kluczowym, ani zarezerwowanym) "ext". Oczywiście,
nie daje to żadnego sensownego wyniku.
Warto zatem wiedzieć, że PHP automatycznie
zastąpi podkreślnikiem "_" każdą kropkę w nazwie każdej
odebranej zmiennej.
Określanie typów zmiennych
Ponieważ PHP samodzielnie określa typy zmiennych i konwertuje je
(zasadniczo) jak potrzeba, nie zawsze jest jasne, jakiego typu jest dana
zmienna w danym momencie. PHP zawiera kilka funkcji do określania typów
zmiennych, takich jak:
gettype(), is_array(),
is_float(), is_int(),
is_object() i
is_string(). Zobacz także rozdział
o Typach.
Ponieważ HTTP jest protokołem tekstowym większość, jeśli nie całość,
zawartości która przychodzi w
tablicach superglobalnych,
jak $_POST czy $_GET pozostanie
łańcuchami znaków. PHP nie będzie próbował konwertować wartości do określonego typu.
W przykładzie poniżej $_GET["var1"] będzie zawierać łańcuch
znaków "null" a $_GET["var2"] łańcuch znaków "123".
/index.php?var1=null&var2=123