@Vernal96

Как избежать повторного подключения к базе данных, если при обращении к родительскому классу DataBase дочерний класс создает подключение вновь?

Дочерний класс объекта при обращении к родительскому классу создает экземпляр подключения к базе данных. Проблема в том что дочерних классов несколько, и при каждом своем вызове они подключаются к базе данных.
Дочерний класс:
class Categories extends DataBase{

	public function __construct() {
		parent::__construct("categories");
	}
	
}


Класс базы данных:
class DataBase {
	
	private $query;
	private $table_name;
	private $mysqli;
	
	public function __construct($table_name) {
		$table = Valid::Table($table_name);
		$table ? $this->table_name = strtolower("`".Config::DB_PREFIX.$table_name."`") : exit();
		$this->mysqli = @new mysqli("p:".Config::DB_HOST, Config::DB_USER, Config::DB_PASSWORD, Config::DB_NAME);
		if ($this->mysqli->connect_errno) exit("Ошибка соединения с базой данных");
		$this->mysqli->query("SET lc_time_names = 'ru_RU'");
		$this->mysqli->query("SET NAMES 'utf8'");
	}
	
	protected function query($query) {
		return $this->mysqli->query($query);
	}


Вызов:
$categories = new Categories();
$subcategories = new SubCategories();
$categories->getCategories();
$subcategories->getCategories();


Лог mySQL:
596 Connect	root@localhost on nk
		  596 Query	SET lc_time_names = 'ru_RU'
		  596 Query	SET NAMES 'utf8'
		  597 Connect	root@localhost on nk
		  597 Query	SET lc_time_names = 'ru_RU'
		  597 Query	SET NAMES 'utf8'
		  596 Query	SELECT * FROM `nkrep_categories`
		  597 Query	SELECT * FROM `nkrep_subcategories`
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 3
@magarif
Программист
Нужно вынести подключение к базе в отдельный класс, и передавать его в конструктор ваших классов, либо подключать синглтон в DataBase
Ответ написан
само собой у вас работает некорректно. Почему-то каждый элемент у вас считается базой. Вы должны разделить два совершенно разных понятия - "соединение с базой" и "сущность из базы"
Ответ написан
ThunderCat
@ThunderCat
{PHP, MySql, HTML, JS, CSS} developer
по уму что-то такое должно быть:
class Category extends Model{
    public $table = 'category';
    public $db = false;
// вариант DI - передаем $db в конструктор
   public function __construct($db){
      $this->db = $db;
   }

//или вариант инициализации по id
   public function __construct($id=false){
      parent::__construct($id); 
// в базовом классе модели берем $db из регистра и присваиваем $this->db
   }
}

$categories = new Collection(new Category());
$categories = $categories->getArrayOfObjects();

Сразу скажу что не очень жалую вариант с DI, так как либо приходится делать синглтон, либо в каждом контроллере делать новый $db(что имхо бред), либо так же совать дб в регистри и тащить его при инициализации каждого объекта. Минус второго способа - IDE "не видит" как подключен дб и интелисенс и прочие плюшки не работают.
Ответ написан
Ваш ответ на вопрос

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

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