Оптимизация подключения к БД

175
11 ноября 2017, 14:02

Делаю сайт на паттерне MVC. В каждой модели есть методы, получающие данные, т.е. к примеру

public static function checkEmailExists($email)
{
    // Соединение с БД
    $db = Db::getConnection();
    // Текст запроса к БД
    $sql = 'SELECT COUNT(*) FROM users WHERE email = :email';
    // Получение результатов. Используется подготовленный запрос
    $result = $db->prepare($sql);
    $result->bindParam(':email', $email, PDO::PARAM_STR);
    $result->execute();
    if ($result->fetchColumn()) {
        return true;
    }
    return false;
}

Сначала в каждом из них соединялся к БД через Db::getConnection(). Скажите, пожалуйста, есть ли в этом смысл? Быть может, лучше соединиться с БД 1 раз в контроллере? Как лучше быть в данной ситуации?

Answer 1

Во-первых, совершенно верно - подключение к БД всегда должно быть только одно, а постоянные соединения в каждой функции тупо убьют сервер.

Во-вторых, надо отдавать себе отчет, что никаким MVC здесь и не пахнет. Набор статических методов - это старое доброе процедурное программирование, вид сбоку.

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

public static function checkEmailExists($email)
{
    $sql = 'SELECT 1 FROM users WHERE email = ?';
    return DB::run($sql, [$email])->fetchColumn();
}

Если же говорить про MVC, то в контроллере не должно быть никаких подключений вообще. А в модели не должно быть никакой статики, соединение должно передаваться в конструктор и присваиваться переменной класса. Из которой оно потом и должно использоваться во всех методах:

public function __construct($pdo)
{
    $this->db = $pdo;
}
public function checkEmailExists($email)
{
    $sql = 'SELECT 1 FROM users WHERE email = ?';
    $result = $this->db->prepare($sql);
    $result->execute([$email]);
    return $result->fetchColumn();
}
READ ALSO
Умножение переменной типа float

Умножение переменной типа float

ЗдравствуйтеИз таблицы БД MySQL в цикле берутся поочерёдно переменные $old_price типа float

190
Большие Sql - запросы

Большие Sql - запросы

Сколько будет выполняться команда select * from table where id = 1, если в таблице будет около 20000 строк? И как можно будет оптимизировать такой запрос

177
Column count doesn't match value count at row 1

Column count doesn't match value count at row 1

Column count doesn't match value count at row 1

212
Как обойти кеширование User Agent?

Как обойти кеширование User Agent?

Не думал что такое возможно, но столкнулся с такой чехардой:

191