Делаю сайт на паттерне 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 раз в контроллере? Как лучше быть в данной ситуации?
Во-первых, совершенно верно - подключение к БД всегда должно быть только одно, а постоянные соединения в каждой функции тупо убьют сервер.
Во-вторых, надо отдавать себе отчет, что никаким 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();
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
ЗдравствуйтеИз таблицы БД MySQL в цикле берутся поочерёдно переменные $old_price типа float
Сколько будет выполняться команда select * from table where id = 1, если в таблице будет около 20000 строк? И как можно будет оптимизировать такой запрос