Хорошо ли написан класс БД? Укажите пожалуйста на грубые ошибки в коде. Планирую использовать этот класс. Не хотелось бы потом внезапно наткнуться на проблемы. Ухожу с синглтона.
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));

21 Авг 2019 в 06:58
217 +1
1
Ответы
1

В целом, класс БД написан достаточно хорошо, но есть несколько моментов, на которые стоит обратить внимание:

В конструкторе класса DB нет обработки ошибок при подключении к базе данных. Вместо использования die('DB ERROR'); лучше выбрасывать исключение и обрабатывать его выше по стеку вызовов.

В методе query можно улучшить защиту от SQL-инъекций, для этого лучше использовать параметризованные запросы вместо конкатенации строк.

Методы getRows и getColumn класса DB могут быть вынесены в отдельный класс, отвечающий за выполнение запросов к базе данных (например, класс Repository).

Применение принципа SOLID несколько нарушено, так как класс DB нарушает принцип единственной ответственности, содержа в себе методы работы с базой данных и конфигурации подключения.

Передача объекта DB в конструктор класса Car также не совсем верна с точки зрения SOLID. Лучше использовать внедрение зависимостей с помощью интерфейсов.

Преимущественно класс DB используется для выполнения запросов, поэтому можно вынести обработку результатов запросов в отдельный класс (например, класс для работы с данными).

Предлагается прочитать больше о паттернах проектирования и принципах SOLID для лучшего понимания правильного построения архитектуры приложения.

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

20 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир