En php, 0 est-il traité comme vide?

144

Le code expliquera plus:

$var = 0;

if (!empty($var)){
echo "Its not empty";
} else {
echo "Its empty";
}

Le résultat renvoie "Son vide". Je pensais que empty () vérifierait si j'avais déjà défini la variable et que j'avais une valeur à l'intérieur. Pourquoi il renvoie "Son vide" ??

mysqllearner
la source
15
@stereo emptyest peut-être la fonction PHP la plus utile mais la plus largement méconnue. Apprenez comment et quand l'utiliser.
deceze
2
@stereo emptyest essentiellement l'abréviation de isset($var) && $var != false. Vous devez tenir votre emptytrès bizarre pour vous tirer une balle dans le pied avec ça. ; P
deceze
@stereo 1) Où est-il "incohérent"? Cela fonctionne comme indiqué sur l'étain. 2) Comparer vaguement une variable à falsesans déclencher une erreur "variable indéfinie" est inutile? Eh bien, je suppose que vous ne faites jamais cela… 3) Choisir la mauvaise fonction dans un contexte de sécurité ne signifie pas que la fonction elle-même est mauvaise, inutile ou incohérente; cela signifie simplement que quelqu'un a choisi la mauvaise fonction pour le travail.
deceze
18
@deceze - Si une fonction est si largement mal comprise empty(), alors elle a probablement le mauvais nom.
martinstoeckli

Réponses:

189

http://php.net/empty

Les éléments suivants sont considérés comme vides:

  • "" (une chaîne vide)
  • 0 (0 sous forme d'entier)
  • 0,0 (0 comme flottant)
  • "0" (0 sous forme de chaîne)
  • NUL
  • FAUX
  • array () (un tableau vide)
  • var $ var; (une variable déclarée, mais sans valeur dans une classe)

Notez que c'est exactement la même liste que pour une coercition en booléen false. emptyest simplement !isset($var) || !$var. Essayez issetplutôt.

déceler
la source
Donc, je dois vérifier comme ceci: if (isset ($ var) && $ var! = 0) {Do Something} ??
mysqllearner
1
@mysql Pour ce cas, vous pourriez aussi bien utiliser !empty($var), mais notez que ce n'est pas la même chose que ce que vous avez écrit dans la question. Ce qu'il faut utiliser dépend entièrement des valeurs que vous souhaitez considérer true. Comparez simplement les différences entre issetet emptyet choisissez la bonne combinaison pour la bonne situation.
deceze
7
@mysqllearner: issetretourne Truesi $var=0. Mais ce que vous voulez dire avec if(isset($var) && $var != 0)est le même queempty
Felix Kling
@mysqllearner isset détecte s'il n'est PAS vide. pour vérifier s'il est vide, utilisez à la place! isset.
1
@Deji Puisque PHP a ses racines en tant que langage Web, et que les valeurs des requêtes HTTP sont toujours des chaînes, il '0'est traité comme équivalent à 0. C'est une philosophie de conception fondamentale de PHP. Je conviens que c'est un choix extrêmement discutable, mais je ne suis pas ici pour débattre de ce choix avec vous. Dans la logique de PHP, emptycomme équivalent à des == falseavis moins, c'est bien IMO. Que certaines choses devraient être très différentes en PHP de ce qu'elles sont est un sujet différent.
deceze
76

Je me demandais pourquoi personne n'avait suggéré le tableau de comparaison des types extrêmement pratique . Il répond à toutes les questions sur les fonctions communes et compare les opérateurs.

Un extrait:

Expression      | empty($x)
----------------+--------
$x = "";        | true    
$x = null       | true    
var $x;         | true    
$x is undefined | true    
$x = array();   | true    
$x = false;     | true    
$x = true;      | false   
$x = 1;         | false   
$x = 42;        | false   
$x = 0;         | true    
$x = -1;        | false   
$x = "1";       | false   
$x = "0";       | true    
$x = "-1";      | false   
$x = "php";     | false   
$x = "true";    | false   
$x = "false";   | false   

Avec d'autres cheatsheets, je garde toujours une copie papier de ce tableau sur mon bureau au cas où je ne serais pas sûr

Savon Dan
la source
2
vous devriez mettre à jour votre aide-mémoire maintenant, je vais vous en donner plus ... 0.0 = vrai, 0.00 = vrai, "0.0" = faux
Dit Mohd Ali
34

En cas de valeurs numériques, vous devez utiliser la fonction is_numeric:

$var = 0;

if (is_numeric($var))
{
  echo "Its not empty";
} 
else 
{
    echo "Its empty";
}
Khandad Niazi
la source
1
Belle solution de contournement lorsque vous avez besoin de vérifier contre «0» ou 0.
nicooo.
12

Utilisez strlen()plutôt. J'ai rencontré le même problème en utilisant 1/0 comme valeurs possibles pour certaines variables. J'utilise if (strlen($_POST['myValue']) == 0)pour tester s'il y a un caractère ou non dans ma variable.

Calin Rusu
la source
il suffit d'ajouter un @strlen pour omettre le journal des erreurs, juste au cas où ... pour ne pas créer un gros journal
Miguel
Pourquoi voudriez-vous mettre @strlen. Tant que vous passez une variable, elle ne devrait pas générer d'erreur. Si votre strlen est vide, il enregistrera la valeur 0.
sketchthat
2
Si la variable n'est pas définie, je pense que vous obtiendrez une erreur.
Evren Yurtesen
11

J'ai récemment été surpris avec mon pantalon baissé sur celui-ci également. Le problème que nous traitons souvent concerne les variables non définies - disons un élément de formulaire qui peut ou non avoir été là, mais pour de nombreux éléments, 0(ou la chaîne '0'qui apparaîtrait plus précisément dans le message, mais serait quand même évaluée comme "false" ) est une valeur légitime dans une liste déroulante.

utiliser d' empty()abord et ensuite strlen()est votre meilleur choix si vous en avez également besoin, comme:

if(!empty($var) && strlen($var)){
    echo '"$var" is present and has a non-falsey value!';
}
Oliver Williams
la source
6

D'un point de vue linguistique, vide a un sens de sans valeur . Comme les autres l'ont dit, vous devrez utiliser isset()pour vérifier si une variable a été définie, ce que vous faites.

Elzo Valugi
la source
1
Cette réponse simple m'a aidé à résoudre facilement un problème de 0versus null. Merci!
Giacomo1968
4

empty()retourne vrai pour tout ce qui est évalué FALSE, c'est en fait un 'not' ( !) déguisé. Je pense que tu voulais direisset()

soulmerge
la source
4

Pour accepter 0 comme valeur dans la variable, utilisez isset

Vérifiez si la variable est vide

$var = 0;

if ($var == '') {
    echo "empty";
} else {
    echo "not empty"; 
}
//output is empty

Vérifiez si la variable est définie

$var = 0;

if (isset($var)) {
    echo "not empty";
} else {    
    echo "empty";
}
//output is not empty
bhu1st
la source
4

Ça marche pour moi!

//
if(isset($_POST['post_var'])&&$_POST['post_var']!==''){
echo $_POST['post_var'];
}

//results:
1 if $_POST['post_var']='1'
0 if $_POST['post_var']='0'
skip if $_POST['post_var']=''
Toan Nguyen Thai
la source
1

Les éléments suivants sont considérés comme vides:

  • "" (une chaîne vide)
  • 0 (0 sous forme d'entier)
  • "0" (0 sous forme de chaîne)
  • NUL
  • FAUX
  • array () (un tableau vide)
  • var $ var; (une variable déclarée, mais sans valeur dans une classe)

À partir du manuel PHP

Dans votre cas $varest 0, donc empty($var)retournera true, vous annulez le résultat avant de le tester, donc le bloc else fonctionnera en donnant " Its empty" en sortie.

codaddict
la source
1

From manual: renvoie FALSE si var a une valeur non vide et non nulle.

Les éléments suivants sont considérés comme vides:

  • "" (une chaîne vide)
  • 0 (0 sous forme d'entier)
  • "0" (0 sous forme de chaîne) NULL
  • FALSE array () (un tableau vide) var
  • $ var; (une variable déclarée, mais sans valeur dans une classe)

En savoir plus: http://php.net/manual/en/function.empty.php

Adam Kiss
la source
1
if (empty($var) && $pieces[$var] != '0') {
//do something
}

Dans mon cas, ce code a fonctionné.

Cherrish
la source
0

En fait, il suffit de vérifier si la variable est définie ou non.Dans ce cas, si vous voulez vérifier si votre variable est vraiment nulle ou vide, vous pouvez utiliser cet exemple:

$myVar = '';
if (empty($myVar))
{
  echo "Its empty";
}
echo "<br/>";

if ($myVar===0)
{
  echo "also zero!";
}

juste pour remarquer que $ myVar == 0 agit comme une fonction vide.

arash
la source
0

vide devrait signifier vide .. quoi que dise deceze.

Quand je fais

$var = '';    
$var = '0';

J'espère que cela var_dump(empty($var));retournera faux.

si vous vérifiez des éléments dans un tableau, vous devez toujours le faire en isset($var)premier.

Paul Wolbers
la source
0

utiliser uniquement ($_POST['input_field_name'])!=0au lieu de !($_POST['input_field_name'])==00 n'est pas considéré comme vide.

Manish Sharma
la source
0

Je ne sais pas s'il y a encore des gens à la recherche d'une explication et d'une solution. Les commentaires ci-dessus disent tout sur les différences entre VRAI / FAUX / 1 / 0.
Je voudrais juste apporter mes 2 cents pour la façon d'afficher la valeur réelle.

BOOLÉEN

Si vous travaillez avec un type de données booléen, vous recherchez un résultat TRUE vs FALSE; si vous le stockez dans MySQL, il sera stocké sous 1 resp. 0 (si je ne me trompe pas, c'est la même chose dans la mémoire de votre serveur).

Donc pour afficher la valeur en PHP, vous devez vérifier si elle est vraie (1) ou fausse (0) et afficher ce que vous voulez: "TRUE" ou "FALSE" ou éventuellement "1" ou "0".
Attention, tout ce qui est plus grand (ou différent) que 0 sera également considéré comme VRAI en PHP. Par exemple: 2, "abc", etc. renverront tous TRUE.

BIT, TINYINT

Si vous travaillez avec un type de données numérique, la façon dont il est stocké est le même.
Pour afficher la valeur, vous devez dire à PHP de la traiter comme un nombre. Le moyen le plus simple que j'ai trouvé est de le multiplier par 1.

Alex Tanner
la source
0

bon exemple. créez simplement un champ de type int (exemple de numéro de mobile) dans la base de données et soumettez une valeur vide pour la base de données suivante via un formulaire ou insérez simplement en utilisant SQL. ce qu'il sera enregistré dans la base de données 0 car il est de type int et ne peut pas être enregistré comme vide ou nul. par conséquent, il est vide mais il sera enregistré sous la forme 0. Ainsi, lorsque vous récupérez des données via PHP et que vous vérifiez les valeurs vides. c'est très utile et logiquement correct.

0,00, 0,000, 0,0000 .... 0,0 ... 0 est également vide et l'exemple ci-dessus peut également être utilisé pour stocker différents types de valeurs dans une base de données comme float, double, decimal (decimal ont différentes variantes comme 0,000 et ainsi de suite.

Sayed Mohd Ali
la source
0

Vous devez utiliser isset () pour vérifier si la valeur est définie.

Veershetty
la source
Bonjour @Veershetty, bienvenue dans Stack Overflow. Merci pour votre réponse, mais cela ne semble rien ajouter de nouveau par rapport aux réponses existantes et plus détaillées. Modifiez la réponse pour ajouter des détails manquants dans les autres réponses ou envisagez de supprimer votre réponse si elle n'ajoute rien de nouveau.
Gricey