PDO fetchObject sets values before calling constructor
| Bug #49521 | PDO fetchObject sets values before calling constructor | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Submitted: | 2009-09-10 11:45 UTC | Modified: | 2010-03-18 23:08 UTC |
|
||||||||||
| From: | waps at pisem dot net | Assigned: | pierrick (profile) | |||||||||||
| Status: | Closed | Package: | PDO related | |||||||||||
| PHP Version: | 5.2.10 | OS: | Ubuntu 8.10 x64 | |||||||||||
| Private report: | No | CVE-ID: | None | |||||||||||
[2009-09-10 11:45 UTC] waps at pisem dot net
Description:
------------
Incorrect creating user object: set data before call constructor method.
Reproduce code:
---------------
---
From manual page: pdostatement.fetchobject
---
class Product {
public function __construct() {
echo 'create object, ';
}
public function __set($offset, $value) {
echo 'set value, ';
}
}
// fetch object
$stmt->fetchObject('Product', array());
Expected result:
----------------
Expected result: create object, set value,
Actual result:
--------------
Actual result: set value, create object,
Patches
Pull Requests
History
AllCommentsChangesGit/SVN commits
[2009-09-21 18:45 UTC] sjoerd@php.net
Confirmed. If the constructor sets default values for some fields, as is typical, the constructor will overwrite the values just retrieved from the database. <?php class Book { function __construct() { $this->title = "Default"; } } $pdo = new PDO('mysql:dbname=books', 'root'); $statement = $pdo->prepare('SELECT * FROM book WHERE title=\'Peopleware\''); $statement->execute(); $obj = $statement->fetchObject('Book'); echo $obj->title; // Expected: Peopleware. Actual: Default ?>[2009-09-22 07:06 UTC] waps at pisem dot net
[2009-11-06 17:07 UTC] caferrari at gmail dot com
Thats evil!... My code with an Ugly solution! <?php class TestObject { public function __construct($id=0, $name='', $mail=''){ // if (isset($this->id)) return; // Ugly solution necessary atm to bypass the problem!. $this->id = $id; $this->name = $nome; $this->mail = $mail; } } $dbh = new PDO('sqlite:'.dirname(__FILE__).'/foo.db'); $qr = $dbh->query("SELECT 1 as id, 'test' as name, 'abc@def.com' as mail"); $x = $qr->fetchObject('TestObject'); print_r($x); Expected: TestObject Object ( [id] => 1 [name] => test [mail] => abc@def.com ) Actual Result: TestObject Object ( [id] => 0 [name] => [mail] => )[2009-11-15 16:23 UTC] felipe@php.net
[2010-03-18 21:44 UTC] davey@php.net
-Status: Closed +Status: Re-Opened
[2010-03-18 23:08 UTC] felipe@php.net
-Status: Re-Opened +Status: Closed