Лучший способ сделать PDO MySQL класс статического соединения? - PullRequest
7 голосов
/ 16 марта 2012

Я довольно новичок в PDO, а также в ООП с PHP в целом, поэтому, пожалуйста, будьте добры :) В основном я пытаюсь создать объект соединения на основе PDO, чтобы у меня было одно соединение, которое я вызываю по всему сайту.

Мне нужны подготовленные операторы, которые просто ищут разные результаты на основе идентификатора, который я передаю, используя тот же объект БД, который я пытаюсь создать ниже.

Как мне создать и получить доступ к указанному ниже классу БД, а затем использовать внутри него функции для извлечения необходимой мне информации? Любые примеры были бы хороши, чтобы я мог получить представление о лучших практиках и т.д.

Большое спасибо заранее.

class db {

    private static $connection;

    private function __construct(){}
    private function __clone(){}

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") {
        if(!$this->connection){
            try{
                $this->connection = new PDO($db_server, $db_user, $db_pass);
            } catch (PDOException $e) {
                $this->connection = null;
                die($e->getMessage());
            }
        }
        return $this->connection;
    }

}

$dbh = new db::connect();

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?");
if($stmt->execute(array($_REQUEST['testid']))) {
  while ($row = $stmt->fetch()) {
    print_r($row);
  }
}

Ответы [ 2 ]

5 голосов
/ 18 марта 2012

Вы можете начать с того, что никогда больше не будете использовать Singleton pattern .Это (и статические классы в целом) является плохим по тем же причинам, по которым глобальные переменные в процедурном программировании являются плохими.

Тем не менее ... Вместо того, чтобы пытаться обеспечить уникальность объекта соединения, вы должныпросто убедившись, что вы используете одно и то же соединение повсюду.

Вот пример того, что я имею в виду под этим:

class Foo
{
    protected $connection = null;
    public function __construct( PDO $connection ) 
    {
        $this->connection = $connection;
    }
}

class Bar
{
    // all the same as in Foo
}

$connection = new PDO('sqlite::memory');

$foo = new Foo( $connection );
$bar = new Bar( $connection );

На данный момент оба $foo и $barобъекты будут иметь доступ к тому же экземпляру PDO.Если у вас есть объект, которому требуется доступ к базе данных, вы просто предоставляете ему соединение в конструкторе.

Есть два видео, которые вы можете посмотреть (слайды будут содержать код Java, но вы не должныпонимая это):

0 голосов
/ 16 марта 2012

Встроенные постоянные соединения:

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true
));

См. Пример # 4 Постоянные соединения

...