【问题标题】:Can I populate an object from a db but still have access to its methods?我可以从数据库中填充一个对象但仍然可以访问它的方法吗?
【发布时间】:2012-10-31 00:23:17
【问题描述】:

这是我今天的第二篇文章,因为我是 PHP 的 OOP 方面的新手,如果这是一个愚蠢的问题,请耐心等待...

我创建了一个漂亮的类,我希望它能够与我的“JOB”对象一起使用,包括能够使用这个单一对象从许多表中提取数据,以便最终用户看到相关数据。例如,在我的课堂上,我有:

public function showProjectManager() {
    $q = "SELECT m.name FROM " . jJOBS . " AS j JOIN " . jMEI . " AS m ON m.uid = j.mei WHERE id = " . $this->id;
    $r = $this->_dblink->query($q);
    $row = $r->fetch_assoc();
    return $row['name'];
}

因为 jJOBS 表中存储的数据只是一个引用另一个表中的 id 的数字。有几条这样的数据存储在主 jJOBS 表中。

因此,在另一段代码中有一个下拉框,可让用户选择特定的“作业”并使用 AJAX 调用来显示该作业中的数据。我要做的是创建一个 JOB 对象(其中包括 showProjectManager 方法),使用 mysqli_fetch_object 从数据库中读取所有属性,然后调用 showProjectManager 方法,如下所示:

    $disp = new Job();
    $q = "SELECT * FROM " . jJOBS . " WHERE id = " . $job_id;
    $r = $jobsdb->query($q);
    $disp = $r->fetch_object();
    $zList .= "<li><span class='smLabels l'>Project Manager :</span>\n<span class='smText r'>" . $disp->showProjectManager() . "</span></li>";

但每当我从数据库中获取对象时,$disp 对象就会恢复为 stdClass。如何维护正确的类并从数据库访问我需要的值?我所读到的关于该主题的所有内容都要求使用 DataMapper,这似乎非常复杂,尤其是在这种情况下。

【问题讨论】:

  • 请学习如何使用准备语句。仅仅因为您使用较新的 API 并不能使其自动变得安全。
  • 我不确定您的评论与此处的任何内容有什么关系,除了提高您的用户统计数据。但是,如果我正确地翻译了这个,你告诉我使用准备好的语句而不是直接查询。好吧,先生,这不是您的任何业务或任何事情,而是我们即将将此数据迁移到 SQL 服务器,这意味着我所有的数据库代码都将发生变化。这也是我自学 OOP 的原因——我正在编写一个新的 SQL 类,与该项目的其余部分一起编写。
  • @DevlshOne 评论不会以任何方式、形状或形式真正“提升统计数据”。如果你想加入未来,你也真的应该学习准备好的陈述。
  • $job_id 来自哪里?
  • @FewPussies,我完全知道如何使用准备好的语句。但是,在这种情况下,我选择不使用它们,因为我正在为 SQL 服务器重写数据库类。

标签: php methods datamapper stdclass


【解决方案1】:

最简单的方法是将类名传递给fetch_object,如下所示:

$q = "SELECT * FROM " . jJOBS . " WHERE id = " . $job_id;
$r = $jobsdb->query($q);
$disp = $r->fetch_object("Job");

根据文档,这将创建 $disp 作为 Job 类型的对象,并填写其所有字段,然后调用 Job 构造函数。

【讨论】:

  • 正确答案不总是“RTFM!”吗?哈哈!谢谢!!.. 我不知道您可以将类名传递给 fetch_object 方法。
【解决方案2】:

您正在重置 $disp 变量。您需要在作业对象中设置作业。像这样将 id 传递给构造函数。

class Job {
    private $job = null;

    function __construct($id = null) {
        if(isset($id)) {
            $q = "SELECT * FROM " . jJOBS . " WHERE id = " . $job_id;
            $r = $jobsdb->query($q);
            $job = $r->fetch_object();
            $this->job = $job;
        }
    }

    function getJob() {
        return $this->job;
    }

    public function showProjectManager() {
        $q = "SELECT m.name FROM " . jJOBS . " AS j JOIN " . jMEI . " AS m ON m.uid = j.mei WHERE id = " . $this->job->id;
        $r = $jobsdb->query($q);
        $row = $r->fetch_object();
        return $row->name;
    }
}

?>

然后

$disp = new Job(123);
$disp->someJobObjectFunction();

【讨论】:

  • 您可能还想将 LIMIT 1 添加到作业选择查询的末尾。
  • 这似乎不是我想要的。这是从 stdClass 的“JOB”对象中返回的“job”属性。如果您将 print_r($disp) 添加到该代码中,您就会明白我的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多