Задать вопрос
sp1se
@sp1se
IT manager

Как правильно реализовать ООП класс базы данных с PDO?

Доброе время суток.
Сильно не пинайте, но никак не получается правильно написать класс базы данных с PDO, так чтоб мне самому он понравился.
Предупреждаю, я не программист, только учусь.
Задача:
Написать класс базы данных для безопасного соединения и работы с ним.
Есть 3 таблицы, users, product, order(sample)
Я хочу написать один класс DB в котором будет происходить соединение и где будут методы для работы со ВСЕМИ таблицами, так например чтоб методом select я мог бы запросить как пользователей в таблице users, так и product..
На сегодняшний день, код мой выглядит вот так ужасно: DB_Class.php
class DB_Class
{
    protected $db;
    function __construct(PDO $db = null){
        $dsn ='mysql:host='.DB_HOST.';dbname='.DB_NAME;
        $this->db = $db;

    try{
        if($this->db === null)
        {
            $this->db = new PDO($dsn, DB_LOGIN, DB_PASS);
        }
      } catch(PDOException $e){
        echo $e->getMessage();
      }
    }
/// Всякие методы и деструктор.
function __destruct(){

      $this->db = null;
    }


В классе users вот такая вот порнография:
public function viewUser($where=0,$param = null){
        try{
         $sql = "";
         $select = "SELECT *
                        FROM users ";

            if(!$where=0)
                    {
                        $wh ="WHERE id =$param";
                        $sql = $select.$wh;
                    }else
            {
                $sql .= $select;
            }
          $query = $this->db->prepare($sql);
          $query->bindParam(':id',$where);
           // var_dump($sql);
           // var_dump($where);
          $query->execute();
          return  $query->fetchAll();
        } catch(PDOException $e){
            $e->getMessage();
        }
    }


Мне не нравится что сам запрос у меня не в классе ДБ, я хотел бы чтоб все методы подключения были в нем, а классы юзер, продукты только дергали нужные методы и передавали необходимые параметры..
Буду признателен за правильное наставление..
  • Вопрос задан
  • 15124 просмотра
Подписаться 7 Оценить 8 комментариев
Ответ пользователя Сергей Протько К ответам на вопрос (2)
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вам нужен класс Connection, в котором есть методы connect и exec (для запросов). И не делайте подключения прямо в конструкторе, лучше в exec сделать проверку и подключать при необходимости (ленивое подключение). Зачем нужно оборачивать соединение? Что бы можно было мокать в тестах.

Так же вам нужен класс Query умеющий строить запросы и который будет принимать метод exec класса Connection. Так же можно его мокать в тестах.

Так же можно замутить QueryBuilder что бы совсем круто было.... Вот его мокать в тестах не стоит, ибо надоест быстро.

Проектируйте интерфейсы классов сначала. Клиенский код (тот который будет использовать вашу библиотеку) не должен знать о реализации интерфейса ничего. Он так же ничего не должен знать о PDO. Так же было бы неплохо перед тем как выполнять запросы брать мета данные таблиц, с которыми вам нужно работать (их можно кешировать) и делать prepared statements внутри Query.

Ну и да, можете ориентироваться на популярные реализации DBAL. Например doctrine/dbal
Ответ написан