嘿伙计们,所以我对面向对象的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()
有什么想法吗?
答案 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()函数?
新数据库()
会给你一个新实例。