Bug #54964 [Opn]: PDO does not use defined class, but instead returns anonymous class
Edit report at http://bugs.php.net/bug.php?id=54964&edit=1
ID: 54964
User updated by: daveb at bulmore dot net
Reported by: daveb at bulmore dot net
Summary: PDO does not use defined class, but instead returns
anonymous class
Status: Open
Type: Bug
Package: PDO related
PHP Version: 5.3.6
Block user comment: N
Private report: N
New Comment:
It appears that the PDO methods return the class, but may also be proxying values from the database.
So there may or may not be a problem.
Previous Comments:
------------------------------------------------------------------------
[2011-05-31 16:34:54] daveb at bulmore dot net
Description:
------------
PDO fetch object methods do not use the class defined:
// not used, but should be
class User {
public $username;
public $first_name;
public $last_name;
public $created;
}
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
$obj = $stmt->fetch(); //returns anonymous class
but instead use a generated anonymous class based on the select statement.
Test script:
---------------
<pre>
<?php
class User {
public $username;
public $first_name;
public $last_name;
public $created;
}
$dbh = new PDO("mysql:host=localhost;dbname=testdb;", "test",
"test");
$stmt = $dbh->query('select * from users');
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
foreach ($stmt as $obj) //or while ($obj = $stmt->fetch())
{
echo $obj->username, " ",
$obj->first_name, " ",
$obj->last_name, " ",
$obj->role, " ",
$obj->verified, " ",
$obj->trusted, " ",
$obj->created, "\n";
}
$dbh = null;
?>
</pre>
<!--
CREATE TABLE users (
username varchar(40) NOT NULL,
password varchar(40) NOT NULL,
first_name varchar(40) DEFAULT NULL,
last_name varchar(60) DEFAULT NULL,
email varchar(255) DEFAULT NULL,
role varchar(20) NOT NULL DEFAULT 'user',
verified varchar(50) NOT NULL DEFAULT 'false',
trusted varchar(5) NOT NULL DEFAULT 'false',
created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (username)
);
-->
Expected result:
----------------
Should get an instance of:
class User {
public $username;
public $first_name;
public $last_name;
public $created;
}
and an error when trying to access the properties:
$obj->role
$obj->verified
$obj->trusted
Actual result:
--------------
Returns an anonymous class with anything that's defined in the select statement.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/bug.php?id=54964&edit=1
Thread (4 messages)