PHP-将准备好的stmt提取到类中:致命错误“未找到类". [英] PHP - fetching prepared stmt into class: Fatal Error "class not found"

查看:98
本文介绍了PHP-将准备好的stmt提取到类中:致命错误“未找到类".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

一些其他信息:

  • 我使用自动加载器来包含我的课程.
  • 我使用名称空间
  • 是的,可以在所有三个函数中创建该类的实例,所以
    类将被包括在内并使用命名空间
  • $ _ Mode == 1可以正常工作
  • 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

有什么想法吗?

推荐答案

如果您的Category类位于名称空间中,则需要将完全限定的类名称传递给fetchAll.

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

现在,PDO正在尝试获取根名称空间中的类Category.它不存在.您需要告诉PDO有关名称空间的信息:

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');

或者使用__NAMESPACE__常量(如果这样更容易(并且正确)):

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

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

或者甚至更好的是,使用PHP 5.5+的::class常量来生成完全限定的类名.

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

这篇关于PHP-将准备好的stmt提取到类中:致命错误“未找到类".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆