Задать вопрос

Выполнение нескольких 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, "Привет из центра галактики");
            }
        }
    }
}
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Поскольку вопрос не ясен, отвечу в целом по коду.

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

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

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

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

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽