2012-02-03 1 views
6

J'utilise filter_var pour valider des valeurs booléennes mais je ne m'attendais pas à ce qu'il ne reconnaisse pas FALSE. Pourquoi cela arrive-t-il?Booléens de validation PHP utilisant filter_var

filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)

retours

null

+2

vous voulez valider le bool FAUX? – rcs20

+1

lire ceci: http: //www.devshed.com/c/a/PHP/Validation-Boolean-Valeurs-et-Float-Numbers-avec-filtres-en-PHP-5/1/ – rcs20

+0

bien oui, je me demande pourquoi 'TRUE' renvoie VRAI mais' FAUX ' renvoie null – RS7

Répondre

5

filter_var est une nouveauté de PHP 5.2. Vous avez rencontré un bug connu: https://bugs.php.net/bug.php?id=49510 N'hésitez pas à voter ou commenter ce bogue.

Vous essayez de faire quelque chose comme ceci:

$v = filter_var($v, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) 

Il y a un certain nombre de solutions de contournement à bas prix comme ceci:

$v = $v===FALSE ? FALSE : filter_var($v, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE) 
2

Il semble que cela est en fait la façon dont il est censé fonctionner, Assez étrangement (oui, mon esprit a été soufflé par cela). De https://bugs.php.net/bug.php?id=51344

Cela va sembler fou quand vous avez regardé au code filtre sous-jacent, mais cela est en fait correcte selon la documentation : le comportement par défaut de filter_input() est de retour NULL pour entrées non existantes et false lorsque la validation échoue, et FILTER_NULL_ON_FAILURE retourne simplement ce comportement à false pour entrées inexistantes et NULL en cas d'échec de validation. (Non, je n'ai pas d'indice où cela serait utile non plus, et le nom de l'indicateur est malheureux dans le contexte filter_input(), car cela implique que NULL ne serait normalement pas retourné. sens lorsqu'il est utilisé avec filter_var(), qui n'a pas été le cas d'entrée inexistante.)

[tableau omis en raison de SO formatage]

Je vais pop un commentaire dans le filter_input() et filter_input_array() implémentations pour noter que c'est par nature, même si le code ne semble pas correct.

La fermeture ne sera pas réparée.

0

Ce fut le comportement lors filter_var a été introduit avec la version 5.2 et résolu à un moment donné après 5.4 comme on le voit par ce https://3v4l.org/Cv1MZ

A partir de la version 5.4 c'est ce qui se passe:

var_dump(filter_var(FALSE, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)); 

bool (false)

qui mak es beaucoup plus de sens.

Questions connexes