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:

  1. UPLOAD_ERR_OK - Nie ma błędu, plik przesłany z sukcesem.
  2. UPLOAD_ERR_INI_SIZE - Przesłany plik przekracza dyrektywę upload_max_filesize w php.ini .
  3. UPLOAD_ERR_PARTIAL - Przesłany plik przekracza dyrektywę MAX_FILE_SIZE określoną w formularzu HTML.
  4. UPLOAD_ERR_NO_FILE - Żaden plik nie został przesłany.
  5. UPLOAD_ERR_NO_TMP_DIR - Brak folderu tymczasowego. (Z PHP 5.0.3).
  6. UPLOAD_ERR_CANT_WRITE - Nie udało się zapisać pliku na dysk. (Z PHP 5.1.0).
  7. 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";
7.0
$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";
7.0
$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);
5.6

$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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow