PHP-将准备好的stmt提取到类中:致命错误”;类未找到”;


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

我想将查询结果提取到类中(提取到类的实例数组中)。但我收到以下错误消息:致命错误:在中找不到类"Category"。。。这是我的数据库管理器类中涉及的两个函数的代码:

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;
}

这是一个在类中调用它们的测试函数:

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");
}

这就是我如何调用测试函数:

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

这就是它应该被提取到的类:

class Category {
private $id;
private $name;
private $projectId;
// getter and setter...
}

一些附加信息:

  • 我使用自动加载器来包含我的类
  • 我使用名称空间
  • 是的,可以在所有三个函数中创建类的实例,因此
    类,并使用名称空间
  • $_Mode==1工作正常

有什么想法吗?

如果Category类位于命名空间中,则需要将完全限定的类名传递到fetchAll中。

现在,PDO正试图获取根命名空间中的类Category。它不存在。你需要告诉PDO关于名称空间:

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

或者使用__NAMESPACE__常数,如果这样更容易(而且是正确的):

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

或者,更好的是,使用PHP5.5+的::class常量来生成完全限定的类名。

use Acme'Package'Category;
$stm->fetchAll('PDO::FETCH_CLASS, Category::class);