ID: 49510 User updated by: m dot kurzyna at crystalpoint dot pl Reported By: m dot kurzyna at crystalpoint dot pl Status: Assigned Bug Type: Filter related Operating System: Linux PHP Version: 5.3.0 Assigned To: pajoye New Comment:
As much as i'd like to have empty string be invalid false cast i have to disagree with you for consistency reasons. If (boolean)'' == false then filter_var('','boolean') should also return false. Both in general and in case of FILTER_NULL_ON_FAILURE (just like the documentation states). Also, because i can't stress it enough, this is a VALIDATOR not a SANITIZER so using it as a strict caster is secondary to it's validation purpose and as such it currently fails both on implied and explicit behavior. The ideal solution would be to have FILTER_VALIDATE_BOOLEAN roughly equal to current behavior with FILTER_NULL_ON_FAILURE and a *seperate* FILTER_SANITIZE_BOOLEAN similar to current behavior w/o the null failure flag. This however probably is impossible due to BC. Previous Comments: ------------------------------------------------------------------------ [2009-09-10 11:09:43] sjo...@php.net I agree that filter_var() should return null for the empty string. I think that this usage of filter_var() is meant to convert string representations of booleans to boolean values. That is, "true", "on", "1", "false", "off" and "0" should be converted, other strings should return null. ------------------------------------------------------------------------ [2009-09-10 09:05:53] m dot kurzyna at crystalpoint dot pl Personally i think it's just fine (empty string ain't false - if anything it's null) but in PHP world it is (both on PHP and C levels): (string)false = '' (boolean)'' == false Z_STRLEN_P(value) = 0 Oh, and there is this little documentation thingy you like to cite from time to time: If FILTER_NULL_ON_FAILURE is set, FALSE is returned only for "0", "false", "off", "no", and "", and NULL is returned for all non-boolean values. where empty string is explicitly stated as being false. ------------------------------------------------------------------------ [2009-09-10 08:57:29] sjo...@php.net Why do you think it is wrong that it returns null for an empty string? ------------------------------------------------------------------------ [2009-09-10 08:53:11] m dot kurzyna at crystalpoint dot pl Actually it is broken even more then i initially reported because it also returns NULL for empty string: filter_var('',FILTER_VALIDATE_BOOLEAN,array('flags'=>FILTER_NULL_ON_FAILURE)) // got NULL, expected false The problem is in ext/filter/logical_filters.c(233) - the check is done by using string representation of zval being checked. For false value it's an empty string and the switch from line 244 doesn't cover this case (hence same result for false and empty string). Something along the lines of following patch should fix the problem: --- logical_filters.c 2009-06-10 21:01:17.000000000 +0200 +++ logical_filters.fixed.c 2009-09-10 10:48:59.953675880 +0200 @@ -242,6 +242,10 @@ * returns false for "0", "false", "off", "no", and "" * null otherwise. */ switch (len) { + case 0: + ret = 0; + break; + case 1: if (*str == '1') { ret = 1; On the side note: i was always wondering why (string)false == '' and not '0'? ------------------------------------------------------------------------ [2009-09-09 23:00:32] paj...@php.net This case sounds wrong: filter_var(false,FILTER_VALIDATE_BOOLEAN,array('flags'=>FILTER_NULL_ON_FAILURE)), // got NULL, expected false I have to check back the code, but this case does not make sense to me. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/49510 -- Edit this bug report at http://bugs.php.net/?id=49510&edit=1