PHP
Odczytywanie danych żądania
Szukaj…
Uwagi
Wybieranie między GET i POST
Żądania GET najlepiej nadają się do dostarczania danych potrzebnych do renderowania strony i mogą być używane wielokrotnie (zapytania wyszukiwania, filtry danych ...). Są częścią adresu URL, co oznacza, że można je dodać do zakładek i często są ponownie wykorzystywane.
Z drugiej strony żądania POST służą do przesłania danych do serwera tylko raz (formularze kontaktowe, formularze logowania ...). W przeciwieństwie do GET, który akceptuje tylko ASCII, żądania POST zezwalają również na dane binarne, w tym przesyłanie plików .
Bardziej szczegółowe wyjaśnienie różnic między nimi można znaleźć tutaj .
Prośba o luki w zabezpieczeniach danych
Zobacz także: jakie są luki w bezpośrednim użyciu GET i POST?
Pobieranie danych z superglobali $ _GET i $ _POST bez jakiejkolwiek walidacji jest uważane za złą praktykę i umożliwia użytkownikom potencjalny dostęp do danych lub narażenie ich na szwank poprzez kod i / lub zastrzyki SQL . Nieprawidłowe dane należy sprawdzić i odrzucić, aby zapobiec takim atakom.
Żądanie danych powinno zostać zmienione w zależności od tego, w jaki sposób są wykorzystywane w kodzie, jak zauważono tutaj i tutaj . W tej odpowiedzi można znaleźć kilka różnych funkcji zmiany znaczenia dla typowych przypadków użycia danych.
Obsługa błędów przesyłania plików
$_FILES["FILE_NAME"]['error']
(gdzie "FILE_NAME"
jest wartością atrybutu nazwy pliku wejściowego, obecnego w formularzu) może zawierać jedną z następujących wartości:
-
UPLOAD_ERR_OK
- Nie ma błędu, plik przesłany z sukcesem. -
UPLOAD_ERR_INI_SIZE
- Przesłany plik przekracza dyrektywę upload_max_filesize wphp.ini
. -
UPLOAD_ERR_PARTIAL
- Przesłany plik przekracza dyrektywę MAX_FILE_SIZE określoną w formularzu HTML. -
UPLOAD_ERR_NO_FILE
- Żaden plik nie został przesłany. -
UPLOAD_ERR_NO_TMP_DIR
- Brak folderu tymczasowego. (Z PHP 5.0.3). -
UPLOAD_ERR_CANT_WRITE
- Nie udało się zapisać pliku na dysk. (Z PHP 5.1.0). -
UPLOAD_ERR_EXTENSION
- Rozszerzenie PHP zatrzymało przesyłanie pliku. (Z PHP 5.2.0).
Podstawowym sposobem sprawdzenia błędów jest:
<?php
$fileError = $_FILES["FILE_NAME"]["error"]; // where FILE_NAME is the name attribute of the file input in your form
switch($fileError) {
case UPLOAD_ERR_INI_SIZE:
// Exceeds max size in php.ini
break;
case UPLOAD_ERR_PARTIAL:
// Exceeds max size in html form
break;
case UPLOAD_ERR_NO_FILE:
// No file was uploaded
break;
case UPLOAD_ERR_NO_TMP_DIR:
// No /tmp dir to write to
break;
case UPLOAD_ERR_CANT_WRITE:
// Error writing to disk
break;
default:
// No error was faced! Phew!
break;
}
Odczytywanie danych POST
Dane z żądania POST są przechowywane w superglobalnej $_POST
w postaci tablicy asocjacyjnej.
Zauważ, że dostęp do nieistniejącego elementu tablicy generuje powiadomienie, więc istnienie należy zawsze sprawdzać za pomocą funkcji isset()
lub empty()
lub operatora koalescencji zerowej.
Przykład:
$from = isset($_POST["name"]) ? $_POST["name"] : "NO NAME";
$message = isset($_POST["message"]) ? $_POST["message"] : "NO MESSAGE";
echo "Message from $from: $message";
$from = $_POST["name"] ?? "NO NAME";
$message = $_POST["message"] ?? "NO MESSAGE";
echo "Message from $from: $message";
Odczytywanie danych GET
Dane z żądania GET są przechowywane w superglobalnej $_GET
w postaci tablicy asocjacyjnej.
Zauważ, że dostęp do nieistniejącego elementu tablicy generuje powiadomienie, więc istnienie należy zawsze sprawdzać za pomocą funkcji isset()
lub empty()
lub operatora koalescencji zerowej.
Przykład: (dla adresu URL /topics.php?author=alice&topic=php
)
$author = isset($_GET["author"]) ? $_GET["author"] : "NO AUTHOR";
$topic = isset($_GET["topic"]) ? $_GET["topic"] : "NO TOPIC";
echo "Showing posts from $author about $topic";
$author = $_GET["author"] ?? "NO AUTHOR";
$topic = $_GET["topic"] ?? "NO TOPIC";
echo "Showing posts from $author about $topic";
Odczytywanie nieprzetworzonych danych POST
Zwykle dane wysyłane w żądaniu POST są ustrukturyzowanymi parami klucz / wartość z typem application/x-www-form-urlencoded
MIME application/x-www-form-urlencoded
. Jednak wiele aplikacji, takich jak usługi sieciowe, wymaga nieprzetworzonych danych, często w formacie XML lub JSON. Dane te można odczytać przy użyciu jednej z dwóch metod.
php://input
to strumień, który zapewnia dostęp do surowego żądania.
$rawdata = file_get_contents("php://input");
// Let's say we got JSON
$decoded = json_decode($rawdata);
$HTTP_RAW_POST_DATA
to zmienna globalna, która zawiera surowe dane POST. Jest dostępny tylko wtedy, gdy always_populate_raw_post_data
dyrektywa always_populate_raw_post_data
w php.ini
.
$rawdata = $HTTP_RAW_POST_DATA;
// Or maybe we get XML
$decoded = simplexml_load_string($rawdata);
Ta zmienna jest przestarzała od PHP w wersji 5.6 i została usunięta w PHP 7.0.
Zauważ, że żadna z tych metod nie jest dostępna, gdy typ zawartości jest ustawiony na multipart/form-data
, który jest używany do przesyłania plików.
Przesyłanie plików za pomocą HTTP PUT
PHP zapewnia obsługę metody HTTP PUT używanej przez niektórych klientów do przechowywania plików na serwerze. Żądania PUT są znacznie prostsze niż przesyłanie plików przy użyciu żądań POST i wyglądają mniej więcej tak:
PUT /path/filename.html HTTP/1.1
W swoim kodzie PHP zrobiłbyś coś takiego:
<?php
/* PUT data comes in on the stdin stream */
$putdata = fopen("php://input", "r");
/* Open a file for writing */
$fp = fopen("putfile.ext", "w");
/* Read the data 1 KB at a time
and write to the file */
while ($data = fread($putdata, 1024))
fwrite($fp, $data);
/* Close the streams */
fclose($fp);
fclose($putdata);
?>
Również tutaj możesz przeczytać ciekawe SO pytanie / odpowiedzi dotyczące otrzymywania pliku przez HTTP PUT.
Przekazywanie tablic przez POST
Zwykle element formularza HTML przesłany do PHP daje jedną wartość. Na przykład:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo" value="bar"/>
<button type="submit">Submit</button>
</form>
Daje to następujące wyniki:
Array
(
[foo] => bar
)
Mogą jednak zdarzyć się przypadki, gdy chcesz przekazać tablicę wartości. Można to zrobić, dodając sufiks podobny do PHP do nazwy elementów HTML:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[]" value="bar"/>
<input type="hidden" name="foo[]" value="baz"/>
<button type="submit">Submit</button>
</form>
Daje to następujące wyniki:
Array
(
[foo] => Array
(
[0] => bar
[1] => baz
)
)
Możesz także określić indeksy tablic jako liczby lub ciągi znaków:
<pre>
<?php print_r($_POST);?>
</pre>
<form method="post">
<input type="hidden" name="foo[42]" value="bar"/>
<input type="hidden" name="foo[foo]" value="baz"/>
<button type="submit">Submit</button>
</form>
Który zwraca ten wynik:
Array
(
[foo] => Array
(
[42] => bar
[foo] => baz
)
)
Tej techniki można użyć, aby uniknąć pętli przetwarzania $_POST
tablicy $_POST
, dzięki czemu kod jest bardziej ubogi i zwięzły.