web-dev-qa-db-fra.com

Meilleure façon de vérifier variable pour une chaîne nulle ou vide?

Puisque PHP est un langage dynamique, quel est le meilleur moyen de vérifier si un champ fourni est vide?

Je veux m'assurer que:

  1. null est considéré comme une chaîne vide
  2. une chaîne contenant uniquement des espaces est considérée comme vide
  3. que "0" n'est pas considéré vide

C'est ce que j'ai jusqu'ici:

$question = trim($_POST['question']);

if ("" === "$question") {
    // Handle error here
}

Il doit y avoir un moyen plus simple de faire cela?

165
Allain Lalonde
// Function for basic field validation (present and neither empty nor only white space
function IsNullOrEmptyString($str){
    return (!isset($str) || trim($str) === '');
}
264
Michael Haren

Ancien post mais quelqu'un pourrait en avoir besoin comme moi;)

if (strlen($str) == 0){
do what ever
}

remplacez $str par votre variable. NULL et "" renvoient tous deux 0 lorsque vous utilisez strlen.

104
jrowe

Utilisez la fonction empty () de PHP. Les éléments suivants sont 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)

Pour plus de détails vérifier fonction vide

29
kta

J'accepterai humblement si je me trompe, mais j'ai testé moi-même et constaté que les méthodes suivantes fonctionnent pour tester les variables à valeur string (0) "" et NULL:

if ( $question ) {
  // Handle success here
}

Ce qui pourrait également être inversé pour tester le succès en tant que tel:

if ( !$question ) {
  // Handle error here
}
19
Adal

Méfiez-vous des faux négatifs de la fonction trim() - elle effectue une conversion en chaîne avant l'ajustement et renvoie par ex. "Array" si vous lui passez un tableau vide. Cela peut ne pas être un problème, selon la façon dont vous traitez vos données, mais avec le code que vous fournissez, un champ nommé question[] pourrait être fourni dans les données POST et sembler être un non chaîne vide. Au lieu de cela, je suggérerais:

$question = $_POST['question'];

if (!is_string || ($question = trim($question))) {
    // Handle error here
}

// If $question was a string, it will have been trimmed by this point
7
Ben Blank

Il n'y a pas de meilleur moyen, mais comme c'est une opération que vous faites habituellement assez souvent, vous feriez mieux d'automatiser le processus.

La plupart des frameworks offrent un moyen de créer des arguments en analysant une tâche facile. Vous pouvez construire votre propre objet pour cela. Exemple rapide et sale:

class Request
{

    // This is the spirit but you may want to make that cleaner :-)
    function get($key, $default=null, $from=null)
    {
         if ($from) :
             if (isset(${'_'.$from}[$key]));
                return sanitize(${'_'.strtoupper($from)}[$key]); // didn't test that but it should work
         else
             if isset($_REQUEST[$key])
                return sanitize($_REQUEST[$key]);

         return $default;
    }

    // basics. Enforce it with filters according to your needs
    function sanitize($data)
    {
          return addslashes(trim($data));
    }

    // your rules here
    function isEmptyString($data)
    {
        return (trim($data) === "" or $data === null);
    }


    function exists($key) {}

    function setFlash($name, $value) {}

    [...]

}

$request = new Request();
$question= $request->get('question', '', 'post');
print $request->isEmptyString($question);

Symfony utilise ce type de sucre en masse.

Mais vous parlez de plus que cela, avec votre "// Handle error here". Vous mélangez 2 tâches: obtenir les données et les traiter. Ce n'est pas du tout la même chose.

Il existe d'autres mécanismes que vous pouvez utiliser pour valider les données. Encore une fois, les cadres peuvent vous montrer les meilleures pratiques.

Créez des objets qui représentent les données de votre formulaire, puis attachez des processus et revenez-y. Le piratage d'un script PHP rapide (et c'est la première fois) semble bien plus fastidieux, mais il est réutilisable, flexible et beaucoup moins sujet aux erreurs depuis la validation du formulaire avec PHP tendance devenir rapidement le code spaguetti.

3
e-satis

pour être plus robuste (tabulation, retour…), je définis:

function is_not_empty_string($str) {
    if (is_string($str) && trim($str, " \t\n\r\0") !== '')
        return true;
    else
        return false;
}

// code to test
$values = array(false, true, null, 'abc', '23', 23, '23.5', 23.5, '', ' ', '0', 0);
foreach ($values as $value) {
    var_export($value);
    if (is_not_empty_string($value)) 
        print(" is a none empty string!\n");
    else
        print(" is not a string or is an empty string\n");
}

sources:

2
bcag2

Celui-ci vérifie les tableaux et chaînes:

function is_set($val) {
  if(is_array($val)) return !empty($val);

  return strlen(trim($val)) ? true : false;
}
1
Chris Clower

Lorsque vous voulez vérifier si une valeur est fournie pour un champ, ce champ peut être un string, un array ou unifine. Donc, ce qui suit suffit

function isSet($param)
{
    return (is_array($param) && count($param)) || trim($param) !== '';
}
1
PHPst

empty () travaillait pour cela, mais le comportement de empty () a changé plusieurs fois. Comme toujours, les documents php sont toujours la meilleure source de comportement exact et les commentaires sur ces pages fournissent généralement un bon historique des modifications apportées au fil du temps. Si vous voulez vérifier l'absence de propriétés d'objet, une méthode très défensive pour le moment est la suivante:

if (is_object($theObject) && (count(get_object_vars($theObject)) > 0)) {
0
NJInamdar