Как лучше организовать соединение с MySQL?

В разных частях программы нужно работать с разными БД.
Это просто - стандартное подключение к серверу и выбор базы. Далее смена базы ($mysqli...$mysqli->select_db).
Все хорошо, всё работает.

Но работать с БД нужно из обычного скрипта, "вложенного" (include), функций, пространства имен и т.д. Ситуаций масса.

Раньше делал по простому - всё "соединение" помещал в один файл. И подключал его везде, где есть работа с БД.
include_once (__DIR__.'/mysql_connect.php');
Но когда понадобилось работать с БД из функций, то $mysqli там не видно. Поэтому
global $mysqli;
Что не очень красиво.

Но ведь можно поместить код соединения БД в функцию, которая будет возвращать ссылку на соединение.
function connect_to_base()
{
$mysqli = new \mysqli($hostname, $username, $password, $main_settings['base']['base_1']);
return $mysqli;
}


И далее вызывать её где угодно, хоть в функции, без global.
$mysqli=connect_to_base(); $mysqli->//...........
Но, при "вложенных" (include) файлах, при таком подходе, количество соединений растет.

С global я всегда использую одно соединение, причем include_once гарантирует, что всегда одно.
А с function connect_to_base() я создаю соединения многократно. Но нет некрасивого global.
А может, есть ещё один вариант?

Как лучше организовать соединение с MySQL?
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 3
kimono
@kimono
Web developer
Попробуйте так:
class MySingleMysqlConnection {
  private static $instance;
  private $connection;
  private function __clone() {}
  private function __construct() {
    $this->connection = new MysqlConnection();
  }
  public static function getConnection(){
    if (null === self::$instance){
      self::$instance = new self();
    }
    return self::$instance->connection;
  }

для обращения используйте MySingleMysqlConnection::getConnection()
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
хм, вам видимо нужно Registry. Статический класс хранения.
https://stackoverflow.com/questions/10101512/whats...
Ответ написан
Комментировать
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
function connect_to_base()
{
global $mysqli, $hostname, $username, $password, $main_settings;
if (!isset($mysqli) OR !is_object($mysqli) OR get_class($mysqli) !== "mysqli")
$mysqli = new \mysqli($hostname, $username, $password, $main_settings['base']['base_1']);
return $mysqli;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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