[PEAR-BUG] Bug #20291 [Com]: Ignored in update $dao->field = 0

[email protected] ("mmn") Fri, 6 Mar 2015 00:35:24 +0000 (GMT)
Newsgroups php.pear.bugs
Message-ID <[email protected]>
Edit report at http://pear.php.net/bugs/bug.php?id=20291&edit=1

 ID:               20291
 Comment by:       mmn
 Reported By:      mmn at hethane dot se
 Summary:          Ignored in update $dao->field = 0
 Status:           Open
 Type:             Bug
 Package:          DB_DataObject
 Operating System: windows8
 Package Version:  1.11.3
 PHP Version:      5.5.3
 New Comment:

I just ran into this issue. The problem is that "disable_null_strings"
will not only test against null _strings_ but anything that can be
compared to false ('', 0, false...).

Here is the code, starting around line 1345 in DB/DataObject.php (latest
stable):

            if ((!isset($this->$k) || ($v == 1 && $this->$k == ''))
                    && $ignore_null
            ) {
                 continue;
            }

If you change $this->$k == '' to $this->$k === '' a type-aware
comparison will be made. Since "&& $ignore_null" is derived from the
config value of "disable_null_strings" we only want to disable null
_strings_, not anything that results in false.

For example, this is true: 0 == ''
which causes the problem of trying to set a value to 0 using default
"disable null strings" unless the 0 value is given _as a string_ ('0').

To fix this properly everywhere, both the "update" and the "insert"
functions need to be fixed identically.
So a quick solution to this problem is to make the type-aware comparison
with three equal signs: $this->$k === ''


The code in the "insert" function looks like this around line 1097, you
can see it is exactly the same:

            if ( (!isset($this->$k) || ($v == 1 && $this->$k == ''))
                    && $ignore_null
            ) {
                continue;
            }



After fixing it should be:

            if ( (!isset($this->$k) || ($v == 1 && $this->$k === ''))
                    && $ignore_null
            ) {
                continue;
            }


Previous Comments:
------------------------------------------------------------------------

[2014-06-09 04:06:14] alan_k

Can you test with the column as not null. Update the schema.

It needs fixing but I need to be sure of the exact reason for it
occurring

------------------------------------------------------------------------

[2014-06-06 13:21:07] yourchoicero

But does not matter is null or not null. If I cannot set an integer,
even 0, this it's a bug. Old version allow it.

------------------------------------------------------------------------

[2014-06-06 13:16:24] yourchoicero

`uti_nb_failed_login` int(4) DEFAULT NULL,

------------------------------------------------------------------------

[2014-06-06 06:55:13] alan_k

is 'field' defined as allow NULL (eg. does not have NOT NULL)

------------------------------------------------------------------------

[2014-06-05 10:48:42] yourchoicero

<div id="changeset">
<span class="removed">-Operating System: update</span>
<span class="added">+Operating System: windows8</span>
</div>

------------------------------------------------------------------------

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://pear.php.net/bugs/bug.php?id=20291

-- 
Edit this bug report at http://pear.php.net/bugs/bug.php?id=20291&edit=1