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

时间:2010-07-08 01:41:34

标签: php oop pdo

嘿伙计们,所以我对面向对象的PHP完全不熟悉 - 我已经阅读了一些教程,但是我找不到任何与PHP类数据库一起工作的东西。

我正在努力做一些简单的事 - 一个快速的新闻课后。你从数据库等获得了帖子。但是,每当我尝试与数据库交互时,我都会收到错误。

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

class Database
{
    public $db;   // handle of the db connexion
    private static $dsn  = "mysql:host=localhost;dbname=test";
    private static $user = "admin";
    private static $pass = "root";
    private static $instance;

    public function __construct () 
    {
        $this->db = new PDO(self::$dsn,self::$user,self::$pass);
    }

    public static function getInstance()
    {
        if(!isset(self::$instance))
        {
            $object= __CLASS__;
            self::$instance=new $object;
        }
        return self::$instance;
    }

    // others global functions
}

然后我尝试在我的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()

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

$db = Database::getInstance();
$query = $this->db->prepare();

您必须同时使用$db$this->db$db是本地函数中的变量。 $this->db是类的实例变量。他们不一样。在这种情况下,$this->db不存在,因此没有成员函数prepare,因为错误说明了。

您正在尝试在父级构造函数中创建$this->db,但由于您要覆盖子类中的构造函数,因此不会运行该代码。您需要调用parent::__constructor才能运行该代码。

答案 1 :(得分:3)

您的设计存在缺陷。为什么新闻会扩展数据库?数据库表示全局数据库连接。新闻表的一行不是数据库连接。所以它不应该继承它。你应该做的是遵循“赞成组合而不是继承”的原则。

扩展单身人士并不是一个好主意。事实上,单身人士总的来说是个坏主意,因为他们会使你的代码变成单一的。

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

答案 2 :(得分:-1)

$ db = Database :: getInstance();  需要: $ db = new Database();

此行$ query = $ this-&gt; db-&gt; prepare(); 需要 $ query = $ db-&gt; prepare();

然后这个$ query-&gt; bindParam(“:id”,$ this-&gt; id,PDO :: PARAM_INT); 需要 $ query-&gt; bindParam(“:id”,$ id,PDO :: PARAM_INT);

我不确定为什么你需要在Database类中使用getInstance()函数?

新数据库()

会给你一个新实例。