2016-09-13 13 views
-1

Ich weiß, diese Frage wurde mehrmals gestellt, aber keine hat das Problem für mich gelöst.

Ich möchte überprüfen, ob irgendwelche Werte im $ _POST-Array mit Ausnahme von zwei (sHostFirstName und sHostLastName) leer sind, und einen 400-Fehler werfen, wenn es einen leeren Wert gibt. Der einzige Weg, wie ich den 400-Fehler erzeugen kann, besteht darin, einen Die() -Befehl nach dem Header-Befehl zu setzen, allerdings bekomme ich den 400-Fehler, egal ob es leere Werte gibt oder nicht.

foreach ($_POST as $key => $value) { 
    if (empty($value) || !isset($value) && $key != 'sHostFirstName' || 'sHostLastName') { 
     header("HTTP/1.1 400 Bad Request"); 
     break; 
    } 
} 
+0

if (empty ($ value) ||! Isset ($ value) && $ key! = 'SHostFirstName' || $ key! = 'SHostLastName') { – JYoThI

+0

'if (empty ($ value) && ($ key! = 'sHostFirstName' || $ key! = 'sHostLastName') {' – nogad

+0

@nogad Ihr zweiter Satz von Bedingungen wird immer zu' true' ausgewertet: Zum Beispiel ist jede Zahl immer nicht 1 oder nicht 2. – jeroen

Antwort

0

So etwas wie dieses

//store and set default if not set - only needed for checkbox or radio buttons. for example, text fields are always submitted as an empty string. 
    $sHostFirstName = isset($_POST['sHostFirstName']) ? $_POST['sHostFirstName'] : false; 
    unset($_POST['sHostFirstName']); //remove so it's not part of our count 
    //store and set default if not set - only needed for checkbox or radio buttons. 
    $sHostLastName = isset($_POST['sHostLastName']) ? $_POST['sHostLastName'] : false; 
    unset($_POST['sHostLastName']); //remove so it's not part of our count 

    $post = array_filter(array_map('trim', $_POST)); //copy post remove empty items. 
    if(count($post) != count($_POST) 
     //if count $_POST is not the same as count $post (empty removed via array_filter) then something was removed/empty 
     header('HTTP/1.1 400 Bad Request', true, 400); 
     exit(); 
    } 

sollte nach ungesetzt tun, ist auf sie verwendet. Siehe

  • speichern sie in Variablen
  • entfernt sie aus dem Post
  • dann von einer Kopie der Post
  • Zählung Kopie leer entfernen (- Leergut) und vergleicht von original
  • zu zählen, wenn die count ist anders als etwas wurde entfernt (dh leer)

keine Notwendigkeit für eine Schleife.

Auch können Sie die optionale 2. und 3. params für Kopf senden:

http://php.net/manual/en/function.header.php

2. = ersetzen - Der optionale Parameter replace gibt an, ob der Header einen vorhergehenden Header ersetzen soll, oder ein hinzufügen zweiter Header desselben Typs. Standardmäßig wird es ersetzt, aber wenn Sie als zweites Argument FALSE übergeben, können Sie mehrere Header desselben Typs erzwingen.

3rd = http_response_code - Erzwingt den HTTP-Antwortcode auf den angegebenen Wert. Beachten Sie, dass dieser Parameter nur dann wirksam wird, wenn die Zeichenfolge nicht leer ist.

+0

sHostFirstName und sHostLastName sind zwei Werte, die leer sein können. Ich werde Ihren Vorschlag versuchen. –

+0

Ich auch durch trim dort mit Array-Karte, ist dies leer zu dir '$ _POST ['something'] = ''; filter funktioniert wie leer, in dem' 0, '0', null, false, '' 'leer sind. – ArtisticPhoenix

+0

Ich bekomme immer noch einen Antwortcode von 200 mit Ihrem Vorschlag. –

1

isset() gibt true zurück, wenn die Variable initialisiert wurde. Wenn Sie ein Formularfeld haben, dessen Name auf userName festgelegt ist, wird der Wert beim Übergeben des Formulars immer "set" sein, obwohl möglicherweise keine Daten darin enthalten sind.

Stattdessen trim() die Zeichenfolge und testen ihre Länge

if("" == trim($_POST['userName'])){ 
    $username = 'Anonymous'; 
} 
0

Es gibt keine Notwendigkeit, eine Schleife durch Ihre POST-Daten. Speichern Sie Ihre POST-Daten in einer Variablen $postData und entfernen Sie die Schlüssel sHostFirstName und sHostLastName, da diese beiden nicht überprüft werden müssen.

Diese $postData enthält alle Schlüsselwertpaare, die auf leere Einträge geprüft werden müssen. Verwenden Sie jetzt array_filter(), um leere Einträge herauszufiltern, und speichern Sie sie unter $filteredArray.

Schließlich, wenn es keine leeren Einträge gab, ist die Länge von $postData identisch mit `` $ filteredArray`. Wenn die Längen nicht übereinstimmen, bedeutet dies, dass ein oder mehrere Array-Schlüssel gefiltert wurden.

$postData = $_POST; 
unset($postData['sHostFirstName'], $postData['sHostLastName']); // $postData contanis all key value pairs which can't be empty 

$filteredArray = array_filter($postData); // Filters out the blank entries 

/* If the length of `$filteredArray` and `$postData` aren't the same, that means one or more fields had been filtered out */ 

if (count($filteredArray) != count($postData)) { 
    header("HTTP/1.1 400 Bad Request"); 
} 
+0

Art von dem, was ich vor 20 min gesagt habe. außer ich stelle mir vor, dass das OP diese Variablen immer noch möchte, was bedeutet, dass sie irgendwo gespeichert werden müssen. – ArtisticPhoenix

+0

Ja, ich möchte immer noch diese Variablen, ich muss nur nicht überprüfen, ob sie leer sind oder nicht. –