Как вы управляете соединениями базы данных в php?
В последнее время я действительно начал активно использовать php, и мне нужно узнать о различных способах использования соединений с базами данных.
Сначала я просто использовал простой mysql_connect():
<?php
$connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
mysql_select_db(DB_DB, $connection);
?>
Через некоторое время я создал класс базы данных, который я начал включать и инициализировать в каждом файле - что-то вроде этого:
<?php
class MySQL_DB {
var $connection;
function MySQL_DB(){
$this->connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
mysql_select_db(DB_DB, $this->connection);
}
function query($q){
$res = mysql_query($q, $this->connection) or die(mysql_error());
return $res;
}
}
$database = New MySQL_DB;
?>
И это то, что я использую в то время - и он отлично работает, но всегда есть способы улучшить.
Итак, мой вопрос к вам - как вы управляете соединениями с базой данных?
- Используете ли вы классы?
- Что содержат ваши классы (просто
соединение или даже функции?)
- Какие рекомендации вы рекомендуете?
Ответы
Ответ 1
Использование классов - это способ повысить настраиваемое повторное использование.
Внесите все общие реализации в класс. Вы на правильном пути.
Этот сайт имеет следующий чистый подход.
Эта ссылка на сайт больше не присутствует. Ссылка на архив.
class connection {
// Possible Modules are as follows:
// DBX_MYSQL, DBX_ODBC, DBX_PGSQL, DBX_MSSQL, DBX_FBSQL, DBX_SYBASECT, DBX_OCI8, DBX_SQLITE
private $module = DBX_MYSQL;
private $host = "localhost";
private $database = "test";
private $username = "testuser";
private $password = "testpass";
private $link;
private $result;
public $sql;
function __construct($database=""){
if (!empty($database)){ $this->database = $database; }
$this->link = dbx_connect($this->module,$this->host,$this->database,$this->username,$this->password);
return $this->link; // returns false if connection could not be made.
}
function query($sql){
if (!empty($sql)){
$this->sql = $sql;
$this->result = dbx_query($this->link,$sql,DBX_RESULT_UNBUFFERED);
return $this->result;
}else{
return false;
}
}
function fetch($result=""){
if (empty($result)){ $result = $this->result; }
return dbx_fetch_row($result);
}
function __destruct(){
dbx_close($this->link);
}
}
Ответ 2
Я рекомендую использовать PDO. Не изобретайте изобретатель. Это хороший OO-интерфейс для многих движков базы данных.
Кроме того, я создаю небольшую функцию, которая просто инициализирует объект PDO. Таким образом, все настройки подключения могут быть изменены в одном месте.
Ответ 3
Ваш нынешний подход довольно стандартный и работает хорошо. Я использовал его в течение длительного времени. Верно, что такие модули, как PDO, предоставляют базовые функции, подобные этому сейчас, что тоже очень хорошо, и вы можете избавиться от проблем с кодом home < brew.
Однако я принял управление соединением еще на один шаг. Если вы попадаете в сложное приложение, вы можете попасть в ситуацию, когда у вас есть несколько баз данных или использование большой базы данных. Включение одного файла подключения к базе данных и наличие глобальной переменной $database
становится громоздким для нескольких баз данных, и это необязательно для запросов приложений, которым может не понадобиться подключение к базе данных. Помните, что подключение к базе данных дорого.
То, что я сделал, это создать класс SingleMan DatabaseManager, который обрабатывает объект базы данных для меня и гарантирует, что несколько соединений с данным БД не будут созданы. Вместо инициализации нового объекта базы данных в верхней части приложения вы просто вызываете DatabaseManager каждый раз, когда вам нужен этот объект.
$db = DatabaseManager::getDatabase();
Вот примерный класс, который я собрал для проекта CodeIgniter. Вы можете видеть в функции getDatabase()
, он просто загружает объект базы данных по умолчанию CodeIgniter, который вы бы заменили для своего собственного класса (и запустили для него процедуру подключения), если вы не использовали CI. Это довольно упрощенный класс управления и может быть расширен для простого управления несколькими подключениями к различным базам данных.
<?php
/**
* Implements the Singleton pattern to prevent multiple instantiations and connections
* to the application database.
*
*/
class Database_manager
{
private static $instance;
public $db;
/**
* Constructor function is declared private to prevent instantiation.
*
*/
protected function __construct()
{
parent::__construct();
}
/**
* Returns an instance of a Database_manager.
*
* @return object Database_manager object
*/
public static function getInstance()
{
if (self::$instance == null) {
$className = __CLASS__;
self::$instance = new $className();
}
return self::$instance;
}
public static function getDatabase()
{
$instance = self::getInstance();
if ($instance->db == null) {
//utilize CodeIgniter database loader
$instance->db = $instance->load->database('',true);
if (! is_object($instance->db)) throw new Exception("Could not load database.");
}
return $instance->db;
}
}
Возможно, наиболее распространенное преимущество, которое я получаю от использования этого стиля управления подключением, - это когда я должен удалить приложение для обслуживания базы данных. Не создавая связи с базой данных до тех пор, пока она мне не понадобится, я могу легко отправить сообщение об обслуживании на сайт (короткое замыкание обычной диспетчеризации MVC) и не беспокоиться о том, чтобы запросы к приложению открывали соединение с БД, прогресс.
Ответ 4
В примере с менеджером базы данных вы не определили родителя для своего класса.
Поэтому вызов parent:: __ constructor() дает исключение,
а также вы не можете использовать свойство load ignitor кода.
Какой класс вы использовали в качестве расширения для вашего DatabaseManager?
Так как я не знаю, где вы поместили свой код databasemanager и какой класс вы использовали в качестве его родителя, я обошел исключения, заставив метод getDatabase() получить входной параметр, который я назвал $loader.
Обычно этот объект $loader будет классом модели, требующим доступа к базе данных.
public static function getDatabase($loader)
{
$instance = self::getInstance();
if ($instance->db == null) {
//utilize CodeIgniter database loader
$instance->db = $loader->load->database('default',true);
if (! is_object($instance->db)) throw new Exception("Could not load database.");
}
return $instance->db;
}
С уважением.