kinske kinske - 1 year ago 65
MySQL Question

PHP - fetching prepared stmt into class: Fatal Error "class not found"

I want to fetch the result of a query into a class (into an array of instances of a class). But I get the following error message:
Fatal error: Class 'Category' not found in ...
This is the code of the two functions in my database manager class that are involved:

public function prepareStatement($_Statement)
$this->preparedStmt = $this->pdo->prepare($_Statement);

if($this->preparedStmt === FALSE)
throw new PreparedStmtException ("Fehler: Statement konnte nicht prepared werden.");
return TRUE;

public function execute($_Params = array(), $_FetchMode = NULL, $_Class = NULL)
# Cancel execution if no statement prepared
if($this->preparedStmt === null)
throw new PreparedStmtException ("Fehler: Statement wurde vor execute nicht prepared.");

# Execute PDO call with params

# If no data is returned throw NoDataException
if($this->preparedStmt->columnCount() == 0)
throw new NoDataException;

// else
// Determine which fetch mode should be called, if NULL or something != 1 || != 0 just call
// fetchAll without params
if ($_FetchMode == 1)
$result = $this->preparedStmt->fetchAll(PDO::FETCH_ASSOC);

else if ($_FetchMode == 2)
$result = $this->preparedStmt->fetchAll(PDO::FETCH_CLASS, $_Class);

$result = $this->preparedStmt->fetchAll();
catch (PDOException $e)
# Errormanagement --> Message im live Betrieb rausnehmen
echo '<div style="color: red;">'.$e->getMessage().'</div>';
$result = FALSE;

// If result is null throw Instance Exception, if result emtpy throw NoDataException
if ($result == null)
throw new InstanceException;
else if (empty($result))
throw new NoDataException;

return $result;

This is a test function in a class to call them:

public function test ()
$stmt = "SELECT * FROM tx_exhibition_category WHERE uid = 1 OR uid = 2";
return $this->mysql->execute (array(), 2, "Category");

This is how i call test function:

$comment = CommentQuery::getInstance();
$result = $comment->test();
var_dump($result); // should be an array with instances of Category

And this is the class where it should be fetched into:

class Category {

private $id;
private $name;
private $projectId;

// getter and setter...

Some additional info:

  • I use an autoloader to include my classes.

  • I use namespaces

  • yes, it is possible to create an instance of the class in all of the three functions, so

    class would be included and namespace used

  • $_Mode == 1 works fine

Any ideas?

Answer Source

If your Category class is in a namespace, you'll need to pass in a fully qualified class name into fetchAll.

Right now, PDO is trying to fetch into the class Category in the root namespace. It doesn't exist. You need to tell PDO about the namespace:

$stm->fetchAll(\PDO::FETCH_CLASS, 'Vendor\\Package\\Category');

Or use a __NAMESPACE__ constant if that makes it easier (and is correct):

$stm->fetchAll(\PDO::FETCH_CLASS, __NAMESPACE__ . '\\Category');

Or, even better, use PHP 5.5+'s ::class constant to ge the fully qualified class name.

use Acme\Package\Category;
$stm->fetchAll(\PDO::FETCH_CLASS, Category::class);
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download