Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
852 views
in Technique[技术] by (71.8m points)

mysql - 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.");
    else
        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.");

    try
    {
        # Execute PDO call with params
        $this->preparedStmt->execute($_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); 

        else 
            $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";
    $this->mysql->prepareStatement($stmt);
    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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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 AcmePackageCategory;
$stm->fetchAll(PDO::FETCH_CLASS, Category::class);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...