Я должен продолжать снова соединяться с mysql в PHP?

Да, я пытаюсь следовать за ним максимально тесно.

я не следую никаким другим стандартам кодирования.

5
задан JasonDavis 9 September 2009 в 06:51
поделиться

6 ответов

Вы можете создать один глобальный объект вашего класса MySQL и использовать этот объект везде. Тогда ваш конструктор будет вызываться только один раз.

Или вы можете создавать новые объекты вашего класса MySQL везде. mysql_connect не открывает новые соединения, если одно уже открыто:

Если выполняется второй вызов mysql_connect () с теми же аргументами, новая ссылка не будет установлена, вместо этого будет возвращен идентификатор уже открытой ссылки.

6
ответ дан 14 December 2019 в 08:56
поделиться

Лучшее Я думаю, что нужно использовать специальный класс для обработки соединений 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 () ->

2
ответ дан 14 December 2019 в 08:56
поделиться

Вы всегда можете сохранить ссылку на ссылку базы данных в переменной класса 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;
  }
}
?>
0
ответ дан 14 December 2019 в 08:56
поделиться

Да, вы не должны подключаться несколько раз. Накладные расходы на открытие и закрытие соединения все время больше, чем затраты на поддержание его в открытом состоянии в течение относительно небольшого времени выполнения ваших скриптов. Поэтому вам следует создать экземпляр класса в начале и сохранить его в глобальной переменной.

Конечно, неплохо написать свои собственные классы в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управление подключением к базе данных (Zend_Db и т. д.).

Накладные расходы на открытие и закрытие соединения все время больше, чем затраты на поддержание его в открытом состоянии в течение относительно небольшого времени выполнения ваших скриптов. Поэтому вам следует создать экземпляр класса в начале и сохранить его в глобальной переменной.

Конечно, неплохо написать свои собственные классы в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управление подключением к базе данных (Zend_Db и т. д.).

Накладные расходы на открытие и закрытие соединения все время больше, чем затраты на поддержание его в открытом состоянии в течение относительно небольшого времени выполнения ваших скриптов. Поэтому вам следует создать экземпляр класса в начале и сохранить его в глобальной переменной.

Конечно, неплохо написать свои собственные классы в качестве упражнения, но, возможно, вам стоит изучить одно из существующих решений для управление подключением к базе данных (Zend_Db и т. д.).

1
ответ дан 14 December 2019 в 08:56
поделиться

Вы можете использовать этот метод, если используете функцию mysql_pconnect (), которая будет искать, есть ли уже соединение mysql, и в случае его обнаружения не создаст другое.

В качестве альтернативы, если вы не планируете использовать экземпляры в php, вы можете напрямую вызвать объект базы данных php, например:

class DB {}

DB::connect($host, $user, $pass);

Если вы используете этот метод, вам не нужно беспокоиться о нескольких соединениях. Конечно, если вам нужно использовать несколько подключений к более чем одной базе данных одновременно, вы можете использовать экземпляры объектов или сделать свой класс так, чтобы он мог принимать несколько параметров и хранить их все одновременно (не очень рекомендуется этот)

-2
ответ дан 14 December 2019 в 08:56
поделиться

Вы должны передать объект подключения (возможно, PDO), и различные места должны иметь возможность воспринимать его либо как параметр, либо как свойство какого-то центрального объекта, которое другие есть ссылка или что-то в этом роде.

Наличие нескольких соединений может быть полезно, кажется безумием, что mysql_connect выбирает существующее соединение, когда вы, возможно, хотели новое - но в любом случае это безумие. Просто используйте PDO.

0
ответ дан 14 December 2019 в 08:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: