Czy wszystkie zmienne są wysyłane za pomocą POST?

85

Muszę wstawić wszystkie zmienne wysłane pocztą, były to pola wyboru, z których każda reprezentowała użytkownika.

Jeśli używam GET, otrzymuję coś takiego:

?19=on&25=on&30=on

Muszę wstawić zmienne do bazy danych.

Jak uzyskać wszystkie zmienne wysłane za pomocą POST? Jako tablica lub wartości oddzielone przecinkami czy coś?

lisovaccaro
źródło

Odpowiedzi:

164

Zmienna $_POSTjest wypełniana automatycznie.

Spróbuj var_dump($_POST);zobaczyć zawartość.

Możesz uzyskać dostęp do poszczególnych wartości, na przykład: echo $_POST["name"];

To oczywiście zakłada, że ​​twój formularz używa typowego kodowania formularza (tj enctype=”multipart/form-data”

Jeśli dane Twojego posta są w innym formacie (np. JSON lub XML, możesz zrobić coś takiego:

$post = file_get_contents('php://input');

i $postbędzie zawierać nieprzetworzone dane.

Zakładając, że używasz $_POSTzmiennej standardowej , możesz sprawdzić, czy pole wyboru jest zaznaczone w następujący sposób:

if(isset($_POST['myCheckbox']) && $_POST['myCheckbox'] == 'Yes')
{
     ...
}

Jeśli masz tablicę pól wyboru (np

<form action="myscript.php" method="post">
  <input type="checkbox" name="myCheckbox[]" value="A" />val1<br />
  <input type="checkbox" name="myCheckbox[]" value="B" />val2<br />
  <input type="checkbox" name="myCheckbox[]" value="C" />val3<br />
  <input type="checkbox" name="myCheckbox[]" value="D" />val4<br />
  <input type="checkbox" name="myCheckbox[]" value="E" />val5
  <input type="submit" name="Submit" value="Submit" />
</form>

Użycie [ ]w polu wyboru nazwy wskazuje, że wybrane wartości będą dostępne przez skrypt PHP jako tablica. W tym przypadku$_POST['myCheckbox'] nie zwróci pojedynczego ciągu, ale zwróci tablicę składającą się ze wszystkich wartości zaznaczonych pól wyboru.

Na przykład, jeśli sprawdzone wszystkie pola, $_POST['myCheckbox']będzie tablica składający się z: {A, B, C, D, E}. Oto przykład, jak pobrać tablicę wartości i wyświetlić je:

  $myboxes = $_POST['myCheckbox'];
  if(empty($myboxes))
  {
    echo("You didn't select any boxes.");
  }
  else
  {
    $i = count($myboxes);
    echo("You selected $i box(es): <br>");
    for($j = 0; $j < $i; $j++)
    {
      echo $myboxes[$j] . "<br>";
    }
  }
Code Magician
źródło
2
Czy na końcu zamierzałeś dodać przykład / link?
1
Dzięki, tak naprawdę próbowałem po prostu print_r ($ _ POST) i nie działało z powodu używania GET przez cały czas. Mój błąd
lisovaccaro
@ Liso22 nie martw się! Przydarza się nam wszystkim :)
Code Magician
5
$ post = file_get_contents ('php: // input'); oszczędził mi czas. Dzięki. O boże,
pieprzony
1
Gratz za 100!
kolejny
77

powinieneś mieć do nich dostęp ze $_POSTzmiennej:

foreach ($_POST as $param_name => $param_val) {
    echo "Param: $param_name; Value: $param_val<br />\n";
}
Tudor Constantin
źródło
Czy na końcu zamierzałeś dodać przykład / link?
1
Zauważyłem dwukropek na końcu odpowiedzi.
Oto odpowiedź na to, o co pytano.
lisandro
11

Jest przestarzały i nie chciał mieć bezpośredniego dostępu do superglobali (myślę, że od PHP 5.5?)

Każde nowoczesne IDE powie Ci:

Nie uzyskuj bezpośredniego dostępu do Superglobali. Użyj niektórych funkcji filtrujących (np. filter_input)

W naszym rozwiązaniu, aby uzyskać wszystkie parametry żądania, musimy użyć metody filter_input_array

Aby uzyskać wszystkie parametry z metody wprowadzania, użyj tego:

$myGetArgs = filter_input_array(INPUT_GET);
$myPostArgs = filter_input_array(INPUT_POST);
$myServerArgs = filter_input_array(INPUT_SERVER);
$myCookieArgs = filter_input_array(INPUT_COOKIE);
...

Teraz możesz go użyć w var_dumplub swoich foreach-Loops

To, co nie działa, to dostęp do $ _REQUEST Superglobal za pomocą tej metody. Zawsze wraca NULLi to prawda.

Jeśli chcesz uzyskać wszystkie parametry wejściowe, przechodząc przez różne metody, po prostu połącz je, jak w poniższej metodzie:

function askForPostAndGetParams(){
    return array_merge ( 
        filter_input_array(INPUT_POST), 
        filter_input_array(INPUT_GET) 
    );
}

Edycja: rozszerzona wersja tej metody (działa również gdy jedna z metod żądania nie jest ustawiona):

function askForRequestedArguments(){
    $getArray = ($tmp = filter_input_array(INPUT_GET)) ? $tmp : Array();
    $postArray = ($tmp = filter_input_array(INPUT_POST)) ? $tmp : Array();
    $allRequests = array_merge($getArray, $postArray);
    return $allRequests;
}
mtizziani
źródło
Otrzymuję błąd krytyczny podczas próby użycia Twojej sugestii „$ postArray = ($ tmp = filter_input_array (INPUT_POST))? $ tmp: Array ();”. FATAL ERROR Wyrażenie stałe zawiera nieprawidłowe operacje w linii numer 5
luckyguy73
@AshtonMorgan Przetestowałem to (kopiuj wklej) i działa dobrze. Jakiej wersji PHP używasz?
mtizziani
8

Więc coś w rodzaju $_POSTtablicy?

Możesz użyć, http_build_query($_POST)aby ponownie uzyskać je w var=xxx&var2=yyyciągu. Albo po prostu print_r($_POST)zobaczyć, co tam jest.

mario
źródło
6

Dlaczego nie to, to proste:

extract($_POST);
bubbahut
źródło
4
Okropny pomysł w obecnej postaci; gigantyczna dziura w zabezpieczeniach.
nikt
2
Ten kod doskonale odpowiada na jego pytanie „Jak uzyskać wszystkie zmienne wysłane za pomocą POST?”, Podczas gdy inne odpowiedzi nie. A najlepsza odpowiedź zostanie odrzucona. Bezpieczeństwo może nie być problemem dla jego projektu. Czy twierdzisz, że ci, którzy zrobili php, popełnili błąd wymyślając tę ​​funkcję, że nigdy nie powinno się jej używać?
bubbahut
2
@bubbahut dokładnie. Nikt nie chce wszystkich zmiennych post dla kodu produkcyjnego.
cowboysaif
5

Używając tego u możesz uzyskać wszystkie zmienne post

print_r($_POST)

źródło