Обращение к базе данных из класса

174
06 января 2020, 02:00

Всем привет! Подскажите такой момент. На сколько плохой практикой является передавать как параметр $link = mysqli_connect($host, $user, $password, $database) в класс.

Что я хочу сделать. Пользователь вводит данные, я должен проверить наличие этих данных в базе, если есть то вернуть другой столбец, соответствующий этим данным. Если нет, то провести операции с этими данными и внести данные в базу.

Что я делаю схематично:

$link = mysqli_connect(...)
class A {
  public function __construct($data, $link) {
    $this->data = $data;
    $this->link = $link;
  public function B() {$result = mysqli_query( $this->links , $query)}
}
$Object = new A($data, $link);
$Object->B();

В общем код не правильный, но это просто схема, думаю смысл понятен. У меня все работает. Но на сколько такой подход не правильный?

Answer 1

Тоже, так, очень схематично (solid. начало):

class MysqlConn
{
    __construct($host, $my_user, $password, $db)
    // тут открываете соединение с бд
}
class Crud
{
    __construct(MysqlConn $dbConn)
    // тут запросы в бд
 }
class UserData 
{
    __construct(Crud $db)
    // тут операции с пользовательскими данными
    // и передача подготовленных данных объекту класса Crud
}
$mysqlConn = new MysqlConn($host, $my_user, $password, $db);
$crud = new Crud($mysqlConn);
$userData = new UserData($crud);
// ... somewhere in a code far far away
$userData->crud->saveInput($data);

Т.е. в данном случае мы разделили ответственности между классами, разнесли свойства и методы, решающие принципиально разные задачи, по отдельным классам. В дальнейшем нам не надо будет снова повторять реализацию подключения/работы с бд в других классах, достаточно будет просто вызывать существующие реализации. Далее, мы избавились от зависимости класса-обработчика на пользовательские данные. Получили гибкость - не придётся постоянно создавать новый объект под новую порцию данных.

Answer 2

Это единственно правильный подход.

READ ALSO
Не загружается файл

Не загружается файл

Всем приветПодскажите, куда делся файл? Название файла в базу записывается

175
Разложить в php ответ из MySQL

Разложить в php ответ из MySQL

Доброе утро, уважаемые! Получаю вывод из MySQL таблицы в таком виде:

194
Как добавить некоторые классы в woocommerce?

Как добавить некоторые классы в woocommerce?

Я нашел способ сделать слайдер на миниатюрах, и добился кодом ниже, но проблема в том что я не могу повесить Lazy load на миниатюры, где я только...

193
Как записать в MYSQL завтрашнюю дату? [дубликат]

Как записать в MYSQL завтрашнюю дату? [дубликат]

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

159