Взаимодействие с базой данных классов PHP (с использованием PDO) - PullRequest
2 голосов
/ 08 июля 2010

Привет, ребята, так что я совершенно новичок в объектно-ориентированном PHP - я прочитал несколько учебных пособий, но не могу найти ничего, что действительно касается работы с базой данных с классами PHP.

Я пытаюсь сделать что-то простое - краткий класс новостей.Вы получаете сообщение из базы данных и т. Д. Однако я получаю сообщение об ошибке всякий раз, когда пытаюсь взаимодействовать с базой данных.

Я прочитал, что PDO - это путь к OO PHP;С этой целью я разработал класс базы данных, как подробно описано в этом посте: Использование PDO в классах

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);
        }
    }
<...>
?>

Каждый раз, когда я пытаюсь запустить этот скрипт, я получаю следующую ошибку:

Неустранимая ошибка: вызов функции-члена prepare () для необъекта в /news.class.php в строке 16

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 10 июля 2010

Ваш дизайн несовершенен. Почему новости расширяют базу данных? База данных представляет ваше глобальное соединение с базой данных. Одна строка таблицы новостей не является подключением к базе данных. Так что не должно наследовать от него. То, что вы должны сделать, это следовать принципу «состав благосклонности над наследованием».

Расширение синглтона не очень хорошая идея. На самом деле, синглтоны вообще плохая идея, потому что они делают ваш код монолитным.

То, что вы делаете, это в основном объектно-реляционное отображение. Вы должны взглянуть на некоторые существующие PHP ORM, я предлагаю Doctrine .

3 голосов
/ 08 июля 2010
$db = Database::getInstance();
$query = $this->db->prepare();

Вам придется использовать либо $db, либо $this->db оба раза. $db - переменная в локальной функции. $this->db является переменной экземпляра класса. Они не одинаковы. В этом случае $this->db не существует и, как таковое, не имеет функции-члена prepare, как говорится в сообщении об ошибке.

Вы пытаетесь создать $this->db в конструкторе вашего родителя, но, поскольку вы переопределяете конструктор в дочернем классе, этот код не запускается. Вам нужно было бы позвонить parent::__constructor для запуска этого кода.

0 голосов
/ 08 июля 2010

$ db = Database :: getInstance ();должно быть: $ db = new Database ();

И эта строка $ query = $ this-> db-> prepare ();должен быть $ query = $ db-> prepare ();

Тогда это $ query-> bindParam (": id", $ this-> id, PDO :: PARAM_INT);должен быть $ query-> bindParam (": id", $ id, PDO :: PARAM_INT);

Я не уверен, зачем вам нужна функция getInstance () в классе Database?

новая база данных ()

даст вам новый экземпляр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...