Хорошо ли написан класс БД? Укажите пожалуйста на грубые ошибки в коде. Планирую использовать этот класс. Не хотелось бы потом внезапно наткнуться на проблемы. Ухожу с синглтона. PS. всё началось с фразы "никакой работы с БД не должно быть в модели". Также начитался про SOLID))) В общем верно ли написал код?class DB { protected $db; public function __construct(){ //require_once 'config_db.php'; try{ $this->db = new PDO('mysql:host=localhost;dbname=test','root',''); }catch(PDOException $e){ die('DB ERROR'); } } private function query($query, array $params = array()){ $stmt = $this->db->prepare($query); if(!empty($params)){ foreach($params as $k => $v){ if(is_int($v)){ $stmt->bindValue(':'.$k, $v, PDO::PARAM_INT); }else{ $stmt->bindValue(':'.$k, $v, PDO::PARAM_STR); } } } $stmt->execute(); return $stmt; } public function getRows($query, array $params = array()){ return $this->query($query, $params)->fetchAll(PDO::FETCH_ASSOC); } public function getColumn($query, array $params = array()){ return $this->query($query, $params)->fetchColumn(); } public function lastInsertId(){ return $this->db->lastInsertId(); } } class Car { protected $db; public function __construct(DB $db){ $this->db = $db; } public function getAll(){ $query = "SELECT `id`, `name` FROM `cars`"; return $this->db->getRows($query); } public function getById(int $id){ $query = "SELECT `id`, `name` FROM `cars` WHERE `id` = :id"; return $this->db->getRows($query, array('id' => $id)); } } $db = new DB(); $car = new Car($db); var_dump($car->getAll()); var_dump($car->getById(1));
В целом, класс БД написан достаточно хорошо, но есть несколько моментов, на которые стоит обратить внимание:
В конструкторе класса DB нет обработки ошибок при подключении к базе данных. Вместо использования die('DB ERROR'); лучше выбрасывать исключение и обрабатывать его выше по стеку вызовов.
В методе query можно улучшить защиту от SQL-инъекций, для этого лучше использовать параметризованные запросы вместо конкатенации строк.
Методы getRows и getColumn класса DB могут быть вынесены в отдельный класс, отвечающий за выполнение запросов к базе данных (например, класс Repository).
Применение принципа SOLID несколько нарушено, так как класс DB нарушает принцип единственной ответственности, содержа в себе методы работы с базой данных и конфигурации подключения.
Передача объекта DB в конструктор класса Car также не совсем верна с точки зрения SOLID. Лучше использовать внедрение зависимостей с помощью интерфейсов.
Преимущественно класс DB используется для выполнения запросов, поэтому можно вынести обработку результатов запросов в отдельный класс (например, класс для работы с данными).
Предлагается прочитать больше о паттернах проектирования и принципах SOLID для лучшего понимания правильного построения архитектуры приложения.
Кроме перечисленных моментов, код выглядит приемлемо и может быть использован, но для более качественного и надежного решения лучше учесть вышеуказанные замечания.
В целом, класс БД написан достаточно хорошо, но есть несколько моментов, на которые стоит обратить внимание:
В конструкторе класса DB нет обработки ошибок при подключении к базе данных. Вместо использования die('DB ERROR'); лучше выбрасывать исключение и обрабатывать его выше по стеку вызовов.
В методе query можно улучшить защиту от SQL-инъекций, для этого лучше использовать параметризованные запросы вместо конкатенации строк.
Методы getRows и getColumn класса DB могут быть вынесены в отдельный класс, отвечающий за выполнение запросов к базе данных (например, класс Repository).
Применение принципа SOLID несколько нарушено, так как класс DB нарушает принцип единственной ответственности, содержа в себе методы работы с базой данных и конфигурации подключения.
Передача объекта DB в конструктор класса Car также не совсем верна с точки зрения SOLID. Лучше использовать внедрение зависимостей с помощью интерфейсов.
Преимущественно класс DB используется для выполнения запросов, поэтому можно вынести обработку результатов запросов в отдельный класс (например, класс для работы с данными).
Предлагается прочитать больше о паттернах проектирования и принципах SOLID для лучшего понимания правильного построения архитектуры приложения.
Кроме перечисленных моментов, код выглядит приемлемо и может быть использован, но для более качественного и надежного решения лучше учесть вышеуказанные замечания.