web-dev-qa-db-fra.com

Vérifier si la valeur $ _POST est vide

if(isset($_POST['submit'])) {
    if(!isset($_POST['userName'])) {
        $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}

Je ne peux pas obtenir le $username pour être "anonyme"? Il est vide ou la valeur de $_POST['userName'].

22
WormHole

isset() retournera true si la variable a été initialisée. Si vous avez un champ de formulaire avec sa valeur name définie sur userName, lorsque ce formulaire est soumis, la valeur sera toujours "définie", bien qu'il puisse ne contenir aucune donnée.

Au lieu de cela, trim() the string et testez sa longueur

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

Si le formulaire a été soumis avec succès, $_POST['userName'] doit toujours être défini, même s'il peut contenir une chaîne vide, ce qui est différent de ne pas être défini du tout. Au lieu de cela, vérifiez s’il s’agit de empty()

if(isset($_POST['submit'])){

    if(empty($_POST['userName'])){
      $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}
38
Michael Berkowski

Pour vérifier si la propriété est présente, quelle que soit la valeur, utilisez:

if (array_key_exists('userName', $_POST)) {}

Pour vérifier si la propriété est définie (la propriété est présente et la valeur n'est pas null ou false), utilisez:

if (isset($_POST['userName'])) {}

Pour vérifier si la propriété est définie et non vide (pas une chaîne vide, 0 (entier), 0.0 (float), '0' (chaîne), null, false ou [] (tableau vide)), utilisez:

if (!empty($_POST['userName'])) {}
8
Gajus

Question: Vérifie si une valeur de $ _POST est vide

Translation: Vérifie si une valeur de clé/index est associée à une valeur.

Réponse: Cela dépend de l’importance que vous accordez à la sécurité. Dépend de ce qui est autorisé comme entrée valide.

1. Some people say use empty().

Dans le manuel PHP: "[Vide] détermine si une variable est considérée comme vide. Une variable est considérée comme vide si elle n'existe pas ou si sa valeur est égale à FALSE." Les éléments suivants sont donc considérés comme vides.

"" (an empty string)
0 (0 as an integer)
0.0 (0 as a float)
"0" (0 as a string)
NULL
FALSE
array() (an empty array)
$var; (a variable declared, but without a value)

Si aucune de ces valeurs n'est valide pour votre contrôle d'entrée, alors empty() fonctionnerait. Le problème ici est que empty() pourrait être trop large pour être utilisé de manière cohérente (de la même manière, pour la même raison, sur différentes soumissions de contrôle de saisie à $_POST ou $_GET). empty() est utile pour vérifier si un tableau entier _ est vide (sans éléments).

2. Some people say use isset().

isset() (une construction de langage) ne peut pas fonctionner sur des tableaux entiers, comme dans isset($myArray). Il ne peut fonctionner que sur variables et éléments de tableau (via l'index/la clé): isset($var) et isset($_POST['username']). La construction isset()language fait deux choses. Il vérifie d’abord si une valeur est associée à une variable ou à un index de tableau. Deuxièmement, il vérifie que cette valeur n'est pas égale à la valeur PHP NULL. 

En bref, la vérification la plus précise peut être accomplie au mieux avec isset(), car certains contrôles de saisie ne sont même pas enregistrés avec $ _POST quand ils ne sont ni sélectionnés ni vérifiés. Je n'ai jamais connu de formulaire ayant soumis la valeur NULL PHP. Ce n’est pas mon cas, j’utilise donc isset() pour vérifier si une clé $_POST n’a pas de valeur associée (et ce n’est pas NULL). isset()is un test beaucoup plus strict de vide (au sens de votre question) que empty().

3. Some people say just do if($var), if($myArray), or if($myArray['userName']) to determine emptiness.

Vous pouvez tester tout ce qui est évalué à true ou false dans une instruction if. Les tableaux vides sont évalués à false, de même que les variables non définies. Les variables contenant la valeur PHP NULL sont également évaluées sur false. Malheureusement, dans ce cas, comme avec empty(), de nombreux autres éléments sont également considérés comme faux: 1. la chaîne vide '', zéro (0), zéro.zéro (0.0), la chaîne zéro '0', boolean false et certains vides Objets XML.

--Doyle, Début PHP 5.3 

En conclusion, utilisez isset() et envisagez de le combiner à d’autres tests. Exemple:

Peut ne pas fonctionner en raison de la superglobale viscosité, mais fonctionnerait sans problème pour les autres tableaux.

if(is_array($_POST) && !empty($_POST))
{
    //Now test for your successful controls in $_POST with isset()
} 

Cela devrait fonctionner aussi.

if(is_array($_POST) && $_POST)
{
    //Now test for your successful controls in $_POST with isset()
    //Always validate your input.
} 

Par conséquent, pourquoi rechercher une valeur associée à une clé avant même de savoir avec certitude que $_POST représente un tableau et que des valeurs y sont stockées (quelque chose que de nombreuses personnes ne prennent pas en compte)? N'oubliez pas que les utilisateurs peuvent envoyer des données à votre formulaire sans utiliser de navigateur Web. Vous pouvez un jour arriver au point de tester que $_POST ne possède que les clés autorisées, mais que cette conversation dure un autre jour.

Référence utile:

PHP Manuel: Tableaux de comparaison de tests de type

3
Anthony Rutledge

je voudrais utiliser un simple comparisant une ligne pour ces cas d'utilisation

$username = trim($_POST['userName'])?:'Anonymous';

Ceci s'applique au cas d'utilisation où vous êtes certain que la journalisation des erreurs est désactivée afin de ne pas recevoir d'avertissement indiquant que la variable n'est pas initialisée.

c'est la version paranoïaque:

$username = !empty(trim(isset($_POST['userName'])?$_POST['userName']:''))?$_POST['userName']:'Anonymous';

Ceci implémente une vérification si la variable $_POST est définie. avant d'y accéder.

2
Tschallacka

Change ça:

if(isset($_POST['submit'])){

    if(!(isset($_POST['userName']))){
    $username = 'Anonymous';
    }      
    else $username = $_POST['userName'];
}

Pour ça:

if(!empty($_POST['userName'])){
     $username = $_POST['userName'];
}

if(empty($_POST['userName'])){
     $username = 'Anonymous';
}
2
Dan Kanze

isset teste si la clé que vous vérifiez dans le hachage (ou le tableau associatif) est "définie". Définir dans ce contexte signifie simplement s’il connaît la valeur. Rien n'est une valeur. Donc, il est défini comme étant une chaîne vide.

Pour cette raison, tant que vous avez un champ de saisie nommé nom d'utilisateur, que vous le remplissiez ou non, cela sera vrai. Ce que vous voulez vraiment faire, c'est vérifier si le nom d'utilisateur est égal à une chaîne vide ''

0
GoldenNewby