Да, я пытаюсь следовать за ним максимально тесно.
я не следую никаким другим стандартам кодирования.
Вы можете создать один глобальный объект вашего класса MySQL и использовать этот объект везде. Тогда ваш конструктор будет вызываться только один раз.
Или вы можете создавать новые объекты вашего класса MySQL везде. mysql_connect не открывает новые соединения, если одно уже открыто:
Если выполняется второй вызов mysql_connect () с теми же аргументами, новая ссылка не будет установлена, вместо этого будет возвращен идентификатор уже открытой ссылки.
Лучшее Я думаю, что нужно использовать специальный класс для обработки соединений mysql и использовать его как синглтон. Сделайте конструктор закрытым и заставьте его возвращать экземпляр существующего или нового соединения.
Вот мой пример:
class db
{
public $host;
public $user;
public $pass;
public $database;
private static $instance = false;
private function __construct()
{
}
public static function getInstance()
{
if (self::$instance === false)
{
self::$instance = new db;
}
return self::$instance;
}
public function db_connect()
{
}
public function db_disconnect()
{
}
}
Таким образом, всякий раз, когда вы вызываете: db :: getInstance () ->
Вы всегда можете сохранить ссылку на ссылку базы данных в переменной класса STATIC и вызывать ее при необходимости. Однако PHP сам по себе пытается использовать существующую ссылку, если она существует в памяти.
У меня для вас пример кода обработчика базы данных, конечно, PHP 5 и использует PDO.
<?php
// Class providing generic data access functionality
class DatabaseHandler
{
// Hold an instance of the PDO class
private static $_mHandler;
// Private constructor to prevent direct creation of object
private function __construct()
{
}
// Return an initialized database handler
private static function GetHandler()
{
// Create a database connection only if one doesn’t already exist
if (!isset(self::$_mHandler))
{
// Execute code catching potential exceptions
try
{
// Create a new PDO class instance
self::$_mHandler =
new PDO(PDO_DSN, DB_USERNAME, DB_PASSWORD);
// Configure PDO to throw exceptions
self::$_mHandler->setAttribute(PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION);
self::$_mHandler->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
}
catch (PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
// Return the database handler
return self::$_mHandler;
}
// Clear the PDO class instance
public static function Close()
{
self::$_mHandler = null;
}
// Wrapper method for PDO::prepare
private static function Prepare($queryString)
{
// Execute code catching potential exceptions
try
{
// Get the database handler and prepare the query
$database_handler = self::GetHandler();
$statement_handler = $database_handler->prepare($queryString);
// Return the prepared statement
return $statement_handler;
}
catch (PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
// Wrapper method for PDOStatement::execute()
public static function Execute($sqlQuery, $params = null)
{
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute query
$statement_handler->execute($params);
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
}
// Wrapper method for PDOStatement::fetchAll()
public static function GetAll($sqlQuery, $params = null,
$fetchStyle = PDO::FETCH_ASSOC)
{
// Initialize the return value to null
$result = null;
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute the query
$statement_handler->execute($params);
// Fetch result
$result = $statement_handler->fetchAll($fetchStyle);
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
// Return the query results
return $result;
}
// Wrapper method for PDOStatement::fetch()
public static function GetRow($sqlQuery, $params = null,
$fetchStyle = PDO::FETCH_ASSOC)
{
// Initialize the return value to null
$result = null;
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute the query
$statement_handler->execute($params);
// Fetch result
$result = $statement_handler->fetch($fetchStyle);
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
// Return the query results
return $result;
}
// Return the first column value from a row
public static function GetOne($sqlQuery, $params = null)
{
// Initialize the return value to null
$result = null;
// Try to execute an SQL query or a stored procedure
try
{
$statement_handler = self::Prepare($sqlQuery);
// Execute the query
$statement_handler->execute($params);
// Fetch result
$result = $statement_handler->fetch(PDO::FETCH_NUM);
/* Save the first value of the result set (first column of the first row)
to $result */
$result = $result[0];
}
// Trigger an error if an exception was thrown when executing the SQL query
catch(PDOException $e)
{
// Close the database handler and trigger an error
self::Close();
trigger_error($e->getMessage(), E_USER_ERROR);
}
// Return the query results
return $result;
}
}
?>
Да, вы не должны подключаться несколько раз. Накладные расходы на открытие и закрытие соединения все время больше, чем затраты на поддержание его в открытом состоянии в течение относительно небольшого времени выполнения ваших скриптов. Поэтому вам следует создать экземпляр класса в начале и сохранить его в глобальной переменной.
Конечно, неплохо написать свои собственные классы в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управление подключением к базе данных (Zend_Db и т. д.).
Накладные расходы на открытие и закрытие соединения все время больше, чем затраты на поддержание его в открытом состоянии в течение относительно небольшого времени выполнения ваших скриптов. Поэтому вам следует создать экземпляр класса в начале и сохранить его в глобальной переменной.Конечно, неплохо написать свои собственные классы в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управление подключением к базе данных (Zend_Db и т. д.).
Накладные расходы на открытие и закрытие соединения все время больше, чем затраты на поддержание его в открытом состоянии в течение относительно небольшого времени выполнения ваших скриптов. Поэтому вам следует создать экземпляр класса в начале и сохранить его в глобальной переменной.Конечно, неплохо написать свои собственные классы в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управление подключением к базе данных (Zend_Db и т. д.).
Вы можете использовать этот метод, если используете функцию mysql_pconnect (), которая будет искать, есть ли уже соединение mysql, и в случае его обнаружения не создаст другое.
В качестве альтернативы, если вы не планируете использовать экземпляры в php, вы можете напрямую вызвать объект базы данных php, например:
class DB {}
DB::connect($host, $user, $pass);
Если вы используете этот метод, вам не нужно беспокоиться о нескольких соединениях. Конечно, если вам нужно использовать несколько подключений к более чем одной базе данных одновременно, вы можете использовать экземпляры объектов или сделать свой класс так, чтобы он мог принимать несколько параметров и хранить их все одновременно (не очень рекомендуется этот)
Вы должны передать объект подключения (возможно, PDO), и различные места должны иметь возможность воспринимать его либо как параметр, либо как свойство какого-то центрального объекта, которое другие есть ссылка или что-то в этом роде.
Наличие нескольких соединений может быть полезно, кажется безумием, что mysql_connect выбирает существующее соединение, когда вы, возможно, хотели новое - но в любом случае это безумие. Просто используйте PDO.