php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #54964 PDO does not use defined class, but instead returns anonymous class
Submitted: 2011-05-31 16:34 UTC Modified: 2014-01-01 12:44 UTC
From: daveb at bulmore dot net Assigned:
Status: Open Package: PDO MySQL
PHP Version: 5.3.6 OS:
Private report: No CVE-ID:
Have you experienced this issue?
Rate the importance of this bug to you:

 [2011-05-31 16:34 UTC] 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.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2011-06-02 07:04 UTC] daveb at bulmore dot net
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.
 [2014-01-01 12:44 UTC] felipe@php.net
-Package: PDO related +Package: PDO MySQL
 
PHP Copyright © 2001-2017 The PHP Group
All rights reserved.
Last updated: Tue Aug 29 15:01:52 2017 UTC