【发布时间】:2011-03-13 02:59:58
【问题描述】:
大家好,我对面向对象的 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()
有什么想法吗?
【问题讨论】:
-
旁注:如果您想将 Database 类实现为单例(即 xx::getInstance()),请将 __construct() 留空,甚至将其设为私有,以便 getInstance() 是唯一的访问它的方式。否则它只是一个带有有趣实例化的普通类。