Sprawdź, czy $ _POST istnieje

101

Próbuję sprawdzić, czy $ _POST istnieje, a jeśli tak, wydrukuj go w innym ciągu, jeśli nie, w ogóle nie drukuj.

coś takiego:

$fromPerson = '+from%3A'.$_POST['fromPerson'];

function fromPerson() {
    if !($_POST['fromPerson']) {
        print ''
    } else {
        print $fromPerson
    };
}

$newString = fromPerson();

Każda pomoc byłaby świetna!

eliwedel
źródło

Odpowiedzi:

171
if( isset($_POST['fromPerson']) )
{
     $fromPerson = '+from%3A'.$_POST['fromPerson'];
     echo $fromPerson;
}
ehmad
źródło
60

Prosty. Masz dwie możliwości:

1. Sprawdź, czy w ogóle istnieją JAKIEKOLWIEK dane posta

//Note: This resolves as true even if all $_POST values are empty strings
if (!empty($_POST))
{
    // handle post data
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}

(LUB)

2. Sprawdź tylko, czy SZCZEGÓLNY klucz jest dostępny w danych pocztowych

if (isset($_POST['fromPerson']) )
{
    $fromPerson = '+from%3A'.$_POST['fromPerson'];
    echo $fromPerson;
}
Dheeraj Bhaskar
źródło
Zgodnie z komentarzem Shi do odpowiedzi Augustusa Francisa , nieempty() jest poprawny dla wyboru nr 1, ponieważ w php ciąg jest równoważny - i zwraca dla wszystkich wartości równoważnych fałszowi . Więc używając , kod pominie drukowanie, jeśli wartość to . Jeśli chcesz wykluczyć pusty ciąg, zobacz odpowiedź Augusta. '0'falseempty()trueempty'0'
ToolmakerSteve
33

Wszyscy mówią, że używają isset () - co prawdopodobnie będzie dla ciebie działać.

Jednak ważne jest, aby zrozumieć różnicę między

$_POST['x'] = NULL; i $_POST['x'] = '';

isset($_POST['x'])zwróci falsew pierwszym przykładzie, ale zwróci truew drugim, nawet jeśli próbujesz wydrukować którykolwiek z nich, oba zwróciłyby pustą wartość.

Jeśli $_POSTpochodzi z pola / formularza wprowadzonego przez użytkownika i pozostaje puste, WIERZĘ (nie jestem tego w 100% pewien), że wartość będzie wynosić „”, ale NIE NULL.

Nawet jeśli to założenie jest niepoprawne (ktoś, proszę, popraw mnie, jeśli się mylę!), Powyższe nadal warto wiedzieć do wykorzystania w przyszłości.

Rafael
źródło
4
empty () sprawdza istnienie zmiennej i niepustą wartość, więc jest to funkcja, której należy użyć, gdy pusty ciąg powinien zwrócić wartość false.
Han Dijk
1
@HanDijk - zgodnie z komentarzem Shi do odpowiedzi Augustusa Francisa , nieempty() jest tutaj poprawne, ponieważ w php ciąg jest równoważny - i zwraca dla wszystkich wartości równoważnych fałszowi . Więc używając , kod pominie drukowanie, jeśli wartość to . '0'falseempty()trueempty'0'
ToolmakerSteve
30

Zaskoczony, że nie wspomniano

if($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['fromPerson'])){
John Magnolia
źródło
2
Czemu? Jeśli metoda serwera nie jest POST, to zmienna POST nie zostanie ustawiona, więc potrzebna jest tylko druga połowa. Czy się mylę?
ToolmakerSteve
@ToolmakerSteve tak, w większości przypadków to wystarczy, ale nie zawsze moją odpowiedzią było pokazanie innego sposobu, w jaki można to zrobić.
John Magnolia,
Będzie również działać, jeśli masz formularz z polami wyboru i prześlij bez nazwy.
John Magnolia,
2
Opisz sytuację, w której isset($_POST['fromPerson']jest true, chociaż if($_SERVER['REQUEST_METHOD'] == 'POST'jest false. O ile nie ma takiej sytuacji, wystarczy tylko isset...część.
ToolmakerSteve
To prawda, ale jest odwrotnie. fromPersonmoże nie być obecny, ale POST może nadal istnieć. Pytanie brzmiało: „Jeśli $ _POST istnieje”. i tylko w przykładzie użyto $ _POST ['fromPerson']. W niektórych sytuacjach, jak opisuje @goat tutaj , nawet jeśli fromPersonbyła to nazwa przesyłania , może nie być obecna w POST.
papo
19
isset($_POST['fromPerson']) 
h3xStream
źródło
13

Właściwym sposobem sprawdzenia, czy klucz tablicy istnieje, jest funkcja array_key_exists()

Różnica polega na tym, że jeśli masz $_POST['variable'] = null, oznacza to, że klucz istnieje i został wysłany, ale wartość była zerowa

Inną opcją jest to, isset()która sprawdzi, czy klucz tablicy istnieje i czy został ustawiony

Ostatnią opcją jest użycie, empty()które sprawdzi, czy klucz tablicy istnieje, jeśli jest ustawiony i czy wartość nie jest uważana za pustą.

Przykłady:

$arr = [
  'a' => null,
  'b' => '',
  'c' => 1
];

array_key_exists('a', $arr); // true
isset($arr['a']); // false
empty($arr['a']); // true


array_key_exists('b', $arr); // true
isset($arr['b']); // true
empty($arr['b']); // true


array_key_exists('c', $arr); // true
isset($arr['c']); // true
empty($arr['c']); // false

Odnośnie twojego pytania

Właściwym sposobem sprawdzenia, czy wartość została wysłana, jest użycie funkcji array_key_exists () z metodą sprawdzania żądania

if ($_SERVER['REQUEST_METHOD'] == 'POST' && array_key_exists('fromPerson', $_POST)    
{
   // logic
}

Ale są pewne przypadki, w zależności od twojej logiki, gdzie isset()i empty()może być również dobre.

Robert
źródło
Fantastyczna odpowiedź, poza sugestią użycia empty. Zgodnie z komentarzem Shi do odpowiedzi Augustusa Francisa , nieempty() jest poprawnym wyborem alternatywnym, ponieważ w php ciąg jest równoważny - i zwraca dla wszystkich wartości równoważnych fałszowi . Więc używając , kod pominie drukowanie, jeśli wartość to . Jeśli chcesz wykluczyć pusty ciąg, zobacz odpowiedź Augusta. '0'falseempty()trueempty'0'
ToolmakerSteve
Najlepsza odpowiedź +1.
Viktor Joras
9
  • W takim przypadku metoda issetnie jest odpowiednia.

Zgodnie z dokumentacją PHP: http://php.net/manual/en/function.array-key-exists.php
(patrz Przykład # 2 array_key_exists () vs isset () )
Metoda array_key_existsjest przeznaczona do sprawdzania obecności klucza w tablicy.

Tak więc kod w pytaniu można zmienić w następujący sposób:

function fromPerson() {
   if (array_key_exists('fromPerson', $_POST) == FALSE) {
        return '';
   } else {
        return '+from%3A'.$_POST['fromPerson'];
   };
}

$newString = fromPerson();


  • Sprawdzanie obecności tablicy $ _POST nie jest konieczne, ponieważ jest to zmienna globalna środowiska PHP od wersji 4.1.0 (obecnie nie spotykamy starszych wersji PHP).
Bronek
źródło
Ten kod różni się zachowaniem od issetrozwiązania tylko wtedy, gdy pole wpisu jest ustawione, ale zawiera wartość NULL. To dobra alternatywa , jeśli chcesz zezwolić NULLw elseoddziale. Jednak jest to błąd, jeśli potrzebny jest ciąg; w tej sytuacji issetdziała dobrze, ale ten kod nie - przekaże NULLwartość dalej. Późniejsza odpowiedź Roberta pokazuje różnicę.
ToolmakerSteve
6

Wszystkie metody są faktycznie odradzane, jest to ostrzeżenie w Netbeans 7.4 i na pewno dobrą praktyką jest nie uzyskiwanie bezpośredniego dostępu do zmiennych superglobalnych, zamiast tego użyj filtru

$fromPerson = filter_input(INPUT_POST, 'fromPerson', FILTER_DEFAULT);
if($fromPerson === NULL) { /*$fromPerson is not present*/ }
else{ /*present*/ }
var_dump($fromPerson);exit(0);
linuxatico
źródło
1
Z drugiej strony ważna jest CZYTALNOŚĆ kodu. IMHO, issetjest o wiele bardziej czytelny niż wyrażenie filtru. Ale dziękuję za wskazanie tego; warto rozważyć tę opcję.
ToolmakerSteve
cóż, możesz napisać własną metodę owijania myIsset / 2, która używa filtrów, ale zachowuje się jak isset / 2
linuxatico
„Wszystkie metody są w rzeczywistości odradzane” - to mocne stwierdzenie (nawet jeśli NetBeans zaznacza jako ostrzeżenie). Czy masz link do wiarygodnego źródła , które zniechęca do bezpośrednich odwołań do $ _POST? (Jest wiele na temat php, który jest zaprojektowany z myślą o wygodzie kodowania, a nie rygorystyczności - spójrz, ile osób w odpowiedziach na to pytanie używa nieprawidłowo empty, potknęło się o luźne pisanie php; trudno sobie wyobrazić, że dostęp do $ _POST zostałby uznany za słaby style.)
ToolmakerSteve
4

Próbować

if (isset($_POST['fromPerson']) && $_POST['fromPerson'] != "") {
    echo "Cool";
}
Augustus Francis
źródło
Komentarz Per Han Dijk na temat odpowiedzi Rafaela, empty($_POST['fromPerson'])czy ten połączony test. Łatwiejsze do czytania i pisania :)
ToolmakerSteve
@ToolmakerSteve: empty('0')zwraca true. Więc to nie to samo.
Shi,
1
@Shi - tak, masz rację; to, co powiedziałem, jest złe! Wygląda na to, że nie ma prostszego rozwiązania niż przedstawiony tutaj kod.
ToolmakerSteve
3

Spróbuj ?isset($_POST['fromPerson'])

strager
źródło
3
if (is_array($_POST) && array_key_exists('fromPerson', $_POST)) {
    echo 'blah' . $_POST['fromPerson'];
}
jezmck
źródło
1
Czy is_array ($ _ POST) sprawdza, czy w POST są jakieś wartości? W mojej aplikacji próbuję określić, czy był post, czy nie, zanim zrobię cokolwiek innego.
Jeff LaFay,
1
Zobacz moją edycję. is_array()sprawdza, czy jest to tablica, druga część sprawdza, czy zawiera element z kluczem 'fromPerson'.
jezmck
2

if( isset($_POST['fromPerson']) ) jest w porządku.

Możesz użyć funkcji i powrotu, lepiej niż kierowanie echem.

Cristian Weiser
źródło
2
Ta odpowiedź nie dodaje do dyskusji nic, czego nie powiedziano już w innych odpowiedziach sprzed lat .
ToolmakerSteve
1

Lubię sprawdzać, czy jest ustawiony i czy jest pusty w operatorze trójskładnikowym.

// POST variable check
$userID  = (isset( $_POST['userID'] )    && !empty( $_POST['userID'] ))   ? $_POST['userID']   :  null;
$line    = (isset( $_POST['line'] )      && !empty( $_POST['line'] ))     ? $_POST['line']     :  null;
$message = (isset( $_POST['message'] )   && !empty( $_POST['message'] ))  ? $_POST['message']  :  null;
$source  = (isset( $_POST['source'] )    && !empty( $_POST['source'] ))   ? $_POST['source']   :  null;
$version = (isset( $_POST['version'] )   && !empty( $_POST['version'] ))  ? $_POST['version']  :  null;
$release = (isset( $_POST['release'] )   && !empty( $_POST['release'] ))  ? $_POST['release']  :  null;
Raymondim
źródło
5
empty('0')jest true. Więc lepiej nie mieć version 0, lub userID 0itp.
Shi
0

Chciałbym dodać swoją odpowiedź, mimo że ten wątek ma już lata i jest dla mnie wysoko w Google.

Moja najlepsza metoda to:

if(sizeof($_POST) !== 0){
// Code...
}

Tak $_POSTjak tablica, jeśli skrypt ładuje się i nie ma danych w $_POSTzmiennej, będzie miał długość tablicy równą 0. Można tego użyć w instrukcji IF.

Możesz się również zastanawiać, czy powoduje to błąd „undefined index”, widząc, że sprawdzamy, czy $_POSTjest ustawiony ... W rzeczywistości $_POSTbłąd „undefined index” pojawi się tylko wtedy, gdy spróbujesz wyszukać $ _POST wartość tablicy, która nie istnieje.

$_POSTzawsze istnieje w sobie, będąc pustym lub ma wartości tablicowe. $_POST['value']może nie istnieć, powodując błąd „undefined index”.

Jack Wright
źródło