【问题标题】:POD::FETCH_CLASS causes infinite loop while PDO::FETCH_BOTH does notPOD::FETCH_CLASS 导致无限循环,而 PDO::FETCH_BOTH 不会
【发布时间】:2011-10-10 10:14:24
【问题描述】:

我遇到了一个难以跟踪的错误,但我不确定是什么导致了这个错误。我有一个类 Property,我想使用名为 loadProperty() 的方法从表 property 中获取一个条目。此方法是单例类 (Registry) 的一部分。

public function loadProperty() {
    $this->load('model', 'property');
    $sth = $this->dbh->prepare("SELECT * FROM property WHERE subdomain = :subdomain LIMIT 1");
    $sth->setFetchMode(PDO::FETCH_CLASS, 'property');
    $data = array('subdomain' => $this->router->subdomain);

    try {
        $sth->execute($data);

        if ($sth->rowCount() == 1) {
            $this->property = $sth->fetch();
        } else {
            $this->property = null;
        }

    } catch (PDOException $exception) {
        // HANDLING EXCEPTION
    }
}

方法的第一行加载模型。它只是查找类文件并使用 require_once 来要求它。

当我使用 PDO::FETCH_BOTH 而不是 PDO::FETCH_CLASS 时,所有这些都可以正常工作。我的猜测是 PDO 在幕后做了一些我不知道的事情,但这会导致我的 loadProperty 方法被无限次调用。

我在这里俯瞰什么?

【问题讨论】:

  • 你的property类是什么样的?
  • Phil,尽管你没有给我答案,但你的问题是在正确的时刻出现的。简而言之,即使 Registry 类是单例,我也不止一次调用它的私有构造函数。我想我想一次做太多事情。感谢您的宝贵时间。
  • @BartJacobs:请将您的解决方案添加为答案并接受它;)这会将问题标记为已回答。谢谢!

标签: php pdo infinite-loop


【解决方案1】:

无限循环原来是由我自己的错误引起的——谁曾想到。通过将 PDO 的获取模式设置为 PDO::FETCH_CLASSPDO 会尝试实例化 Property 的实例,这可能是人们所期望的。但是,模型在其构造方法中创建了对 Registry 类的引用,从而导致调用 Registry 类的构造方法,其中包括 loadProperty 方法如上。结果是一个无限循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-22
    • 2016-05-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2015-05-20
    • 2013-06-17
    • 1970-01-01
    相关资源
    最近更新 更多