Страницы

Поиск по вопросам

суббота, 13 июля 2019 г.

Правильное подключение PDO

Есть подключение к БД:
class Db {
public static function getConnection() {
$paramsPath = ROOT . '/config/db_params.php'; $params = include($paramsPath);
$dsn = "mysql:host={$params['host']};dbname={$params['dbname']}"; $db = new PDO($dsn, $params['user'], $params['password']); $db->exec("set names utf8");
return $db; }
}
И в каждом классе, в каждом методе я делаю такое:
public static function getCategoriesList() {
$db = Db::getConnection();
$result = $db->query('SELECT id, name FROM category ' . 'ORDER BY sort_order ASC');
......... }
Как избавитсья вот от этого говнокода? $db = Db::getConnection();
Как можно в индексном файле вызывать подключение и не подключаться каждый раз в каждом методе? Как вариант создать класс подключения и в других классах стучаться в него через конструктор?


Ответ

Просто сохраняйте соединение в статической переменной:
private static $db = null; public static function getConnection() { if (!is_null(self::$db)) return self::$db; // ... self::$db = ...; return self::$db; }
Однако, это способно доставить боль, как только возникнет необходимость во втором соединении.
В вашем случае(статические классы) примерно то же самое можно сделать и в клиентских классах:
class Advt { private static $db; public static function setDB(DB $db){self::$db = $db;} public static function getAdvtList($page = 1) { //... self::$db->query(...); //... } } Advt::setDB(DB::getConnection());

Всё, что ниже - просто моё видение того, как примерно это должно быть.
Лучше хранить соединение в экземпляре DB, и реализовав пару методов для запросов, работать с ним. В классах, чьё существование без соединения с базой не имеет смысла, можно передать объект базы в конструктор и сохранить в $this->db скажем.

class Db { private $config; private $connection; public function __construct() { $paramsPath = ROOT . '/config/db_params.php'; $this->config = include($paramsPath); } public function connect() {
$dsn = "mysql:host={$this->config['host']};dbname={$this->config['dbname']}"; $this->connection = new PDO($dsn, $this->config['user'], $this->config['password']); $this->connection->exec("set names utf8"); } public function query($sql, $params) { if (!$this->connection) $this->connect(); // prepare/execute } public function rows($sql, $params) { // query/fetch } // fetch rows public function row($sql, $params) {} // fetch one row public function col($sql, $params, $col = 0) {} // fetch column public function cell($sql, $params, $col = 0) {} // fetch scalar value }
somecontroller.php
class A { protected $db; public function __construct(DB $db) {$this->db = $db;} public function getUser($id) { return $this->db->row('SELECT * FROM Users WHERE id = ?', [$id]); } }

Комментариев нет:

Отправить комментарий