Использование PDO в классах

У меня есть несколько классов, которые выполняют некоторые вопросы MySQL и подготовленные заявления. Однако я потерян в том, как включить мой объект PDO в тех классах. Например, я хочу сделать что-то вроде этого:

<?php

$dbh = new PDO(...);

class Foo extends PDO {
    public $dbh;

    public function bar() {
        $this->dbh->prepare('SELECT * FROM table');
        $this->dbh->execute();

    }
}


?>

К сожалению, это не работает. Кто-либо может предложить изящный способ сделать это? Спасибо за внимание. Извините я плохо знаком с этим, пожалуйста, оставьте любые комментарии, если Вы неясны о чем-нибудь, и я приложу все усилия, чтобы ответить!

26
задан axsuul 12 January 2010 в 06:57
поделиться

2 ответа

Можно инстанцировать подключение к базе данных в классе, реализующем однокнопочный шаблон. Соединение будет выполнено один раз, и этот класс будет легко доступен для всех остальных ваших объектов / скриптов.

я использую класс с именем "Core" в следующем примере;

class Core
{
    public $dbh; // handle of the db connexion
    private static $instance;

    private function __construct()
    {
        // building data source name from config
        $dsn = 'pgsql:host=' . Config::read('db.host') .
               ';dbname='    . Config::read('db.basename') .
               ';port='      . Config::read('db.port') .
               ';connect_timeout=15';
        // getting DB user from config                
        $user = Config::read('db.user');
        // getting DB password from config                
        $password = Config::read('db.password');

        $this->dbh = new PDO($dsn, $user, $password);
    }

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

    // others global functions
}

этот класс берет параметры из статического класса с именем "Config", где вы можете хранить вашу конфигурацию:

<?php
class Config
{
    static $confArray;

    public static function read($name)
    {
        return self::$confArray[$name];
    }

    public static function write($name, $value)
    {
        self::$confArray[$name] = $value;
    }

}

// db
Config::write('db.host', '127.0.0.1');
Config::write('db.port', '5432');
Config::write('db.basename', 'mydb');
Config::write('db.user', 'myuser');
Config::write('db.password', 'mypassword');

во всех ваших скриптах/объектах вы просто должны получить экземпляр Core и затем запросить DB

$sql = "select login, email from users where id = :id";

try {
    $core = Core::getInstance();
    $stmt = $core->dbh->prepare($sql);
    $stmt->bindParam(':id', $this->id, PDO::PARAM_INT);

    if ($stmt->execute()) {
        $o = $stmt->fetch(PDO::FETCH_OBJ);
        // blablabla....

если вам нужна дополнительная информация об singleton, посмотрите PHP doc http://php.net/manual/en/language.oop5.patterns.php

61
ответ дан 28 November 2019 в 06:28
поделиться

$ DBH Не в пределах объема FOO , сделайте это вместо этого:

class Foo /*extends PDO*/
{
    public $dbh;

    public function __construct()
    {
        $dbh = new PDO(/*...*/);
    }

    public function bar()
    {
        $this->dbh->prepare('SELECT * FROM table');
        return $this->dbh->execute();
    }
}

также, Foo не нужно расширить PDO .

3
ответ дан 28 November 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: