PHP类数据库交互(使用PDO)

PHP类数据库交互(使用PDO),php,oop,pdo,Php,Oop,Pdo,嘿,伙计们,我对面向对象的PHP完全陌生——我读过一些教程,但我找不到任何真正适用于使用PHP类的数据库的东西 我试着做一些简单的事情-一个快速的新闻发布类。您可以从数据库中获取帖子,等等。但是,每当我尝试与数据库交互时,都会出现错误 我读到PDO是使用OO-PHP的方式;为此,我开发了一个数据库类,详见本文: 然后我尝试在我的PHP类中使用它,以便检索新闻帖子上的数据: <?php require_once "database.php"; class news extends Data

嘿,伙计们,我对面向对象的PHP完全陌生——我读过一些教程,但我找不到任何真正适用于使用PHP类的数据库的东西

我试着做一些简单的事情-一个快速的新闻发布类。您可以从数据库中获取帖子,等等。但是,每当我尝试与数据库交互时,都会出现错误

我读到PDO是使用OO-PHP的方式;为此,我开发了一个数据库类,详见本文:

然后我尝试在我的PHP类中使用它,以便检索新闻帖子上的数据:

<?php
require_once "database.php";

class news extends Database
{
    private $title;
    private $author;
    private $date;
    private $content;
    private $category;


    function __construct($id)
    {
        $db = Database::getInstance();
        $query = $this->db->prepare("SELECT title, author, date, content, category FROM news WHERE id = :id LIMIT 1");
        $query->bindParam(":id", $this->id, PDO::PARAM_INT);
        if ($query->execute())
        {
            $result = $query->fetch(PDO::FETCH_OBJ);

            $this->set_title($result->title);
            $this->set_author($result->author);
            $this->set_date($result->date);
            $this->set_content($result->content);
            $this->set_category($result->category);
        }
    }
<...>
?>
但每次尝试运行此脚本时,都会出现以下错误:

致命错误:对第16行/news.class.php中的非对象调用成员函数prepare

有什么想法吗

$db = Database::getInstance();
$query = $this->db->prepare();
您必须同时使用$db或$this->db$db是局部函数中的一个变量$此->db是该类的一个实例变量。他们不一样。在这种情况下,$this->db不存在,因此没有成员函数prepare,如错误所述


您试图在父类的构造函数中创建$this->db,但由于您在子类中重写了构造函数,因此该代码不会运行。您需要调用parent::\u构造函数才能运行该代码。

$db=Database::getInstance; 需要: $db=新数据库

这一行$query=$this->db->prepare; 需要 $query=$db->prepare

然后这个$query->bindParam:id,$this->id,PDO::PARAM_INT; 需要 $query->bindParam:id,$id,PDO::PARAM\u INT

我不知道为什么在数据库类中需要getInstance函数?

新数据库


将为您提供一个新实例。

您的设计有缺陷。新闻为什么要扩展数据库?数据库表示您的全局数据库连接。新闻表的一行不是数据库连接。所以它不应该继承它。你应该做的是遵循优先组合优先于继承的原则

扩展单例不是一个好主意。事实上,一般来说,单例是个坏主意,因为它们使您的代码是单片的


您所做的基本上是对象关系映射。我建议您应该看看一些现有的PHP表单。

错误已经改变;但是不应该存在,因为我在数据库类中有$db作为PDO对象?致命错误:在第16行的/home1/centasmn/public_html/other_sites/test/news.class.php中调用未定义的方法Database::prepare返回数据库类的实例,该实例本身也没有prepare方法$db->db是您正在寻找的对象,但这可能不是您希望使用该对象的方式。我相信他希望使用getInstance实现单例模式。可能-但我想从一开始就学习好习惯,即使这意味着更陡峭的学习曲线。谢谢你的回答!旁注:如果您想将数据库类实现为一个单例,即xx::getInstance,请将_构造留空,甚至将其设为私有,以便getInstance是访问它的唯一方法。否则,它只是一个具有有趣实例化的常规类。如果我不想使用像条令这样大的东西,您会如何进行数据库/对象交互?
$db = Database::getInstance();
$query = $this->db->prepare();