ddv88
@ddv88
Binance Futures

Выполнение нескольких Mysql запросов без разрыва соединения?

Предположим есть какая то абстрактная задача...

Стартует подключение к БД через расширяющий класс Model, затем начинает выполняться функция home() из класса Home дочернего для Controller.
По ходу выполнения этой функции происходят запросы к БД, затем ловится ошибка и идет обращение к функции наследуемого класса Controller, где происходит повторное создание подключения (???) и выполняется еще один запрос к БД. Листинг ниже представляется схематичным и не имеет прямых зависимостей.
Обертку для Mysqli использую эту.

Вопросы:
  1. Нужно ли получать инстанс текущего mysqli класса и передавать его из дочернего класса контроллера (Home) в расширяемый (Controller)?
  2. Насколько это вообще имеет смысл?
  3. Правильно ли я понимаю, что при создании экземпляра, создается новое подключение или подключение держится по ходу всего выполнения текущего процесса?


class Mysqli {

public function __construct($host = null, $username = null, $password = null, $db = null, $port = null, $charset = 'utf8', 
        $socket = null) {
        $isSubQuery = false;

        if (is_array($host)) {
            foreach ($host as $key => $val) {
                $$key = $val;
            }
        }
        $this->addConnection('default', [
            'host' => $host,
            'username' => $username,
            'password' => $password,
            'db' => $db,
            'port' => $port,
            'socket' => $socket,
            'charset' => $charset
        ]);
        if ($isSubQuery) {
            $this->isSubQuery = true;
            return;
        }
        if (isset($prefix)) {
            $this->setPrefix($prefix);
        }
        self::$_instance = $this;
    }
}

class Model extends Mysqli {
            public function __construct() {
                parent::__construct;
                try {
                     $this->connect();
                } catch (\Exception $exception) {
                     exit($exception->getMessage());
                }
            }
        }

class Controller {

    protected function error_log(string $error_type, int $error_code, string $comment){
        $mysql = new Model;
        $mysql->insert(.....);
     }
}

class Home extends Controller {

    public function home() {
        $model = new Model;
        for ($i = 0; $i <= 10; $i++) {
            try {
                //ищем край вселенной
                $model->insert(.....);
                //культивируем кукурузу
                $model->update(.....);
            } catch (\Exception $exception) {
                //Чпок! Поймали ошибку
                $this->error_log($this->error->get_error_type, $this->error->get_error_code, "Привет из центра галактики");
            }
        }
    }
}
  • Вопрос задан
  • 117 просмотров
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Поскольку вопрос не ясен, отвечу в целом по коду.

Класс Модель - это НЕ обёртка для SQL запросов. И поэтому не должна наследовать mysqli.

Логировать ошибки в бд - это ужас. Сделайте себе одолжение, логируйте в файл.

Обработка ошибок на месте - это дважды ужас. Если подсчитать, сколько электроэнергии потратили пользователи похапе, старательно выписывая эти бессмысленные заклинания трай, кетч, лог еррор в каждой функции, то глобальное потепление уже давно бы сменилось похолоданием. Исключение - это не результат работы функции. Не надо писать трай на каждый чих, как будто это if ($result = mysql_query()). Исключение можно поймать в совсем другом месте. Наппимер, в глобальном трай кетче вокруг всего приложения. Или более интеллектуальный вариант - хендлер исключений

exit($exception->getMessage()); - это вообще за гранью добра и зла. Какой сакральный смысл несёт кетч с таким содержимым?

В целом, это классический вопрос про управление зависимостями. Ответ тоже классический - все зависимости передавать через параметры конструктора. Для облегчения этого процесса служит di контейнер.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы