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

415
10 февраля 2017, 06:20

Есть подключение к БД:

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();

Как можно в индексном файле вызывать подключение и не подключаться каждый раз в каждом методе? Как вариант создать класс подключения и в других классах стучаться в него через конструктор?

Answer 1

Просто сохраняйте соединение в статической переменной:

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]);
  }
}
READ ALSO
Ошибка синтаксиса dollar quoting postgresql в Yii2 Db execute()

Ошибка синтаксиса dollar quoting postgresql в Yii2 Db execute()

Создаю триггер с помощью миграции, PostgreSQLДелаю запрос напрямую в БД -> отрабатывает корректно: и функция, и триггер создаются

418
Вывод данных в html

Вывод данных в html

Допустим у нас имеется html страницы (вывод тела):

415
Как передать данные в скрипт PHP из HTML?

Как передать данные в скрипт PHP из HTML?

Вопрос следующий имеется страничка на HTML в ней есть поля для логина и пароля для подключения к БДКак передать вводимые данные в скрипт?

329