Соединение с базой данных в конструкторе и деструкторе

Я использую разные способы взаимодействия с базами данных в PHP, и одна из идей, с которыми я играю, - это подключение к базе данных в конструкторе и отключение в деструкторе. Это код из моего класса Database.

function __construct()
{
  $this->link = mysql_connect($this->server.':'.$this->port, $this->username);
  if(!$this->link)
    die('Could not connect: '.mysql_error());

  if(!mysql_select_db($this->database, $this->link))
    die('Could not select database: '.mysql_error());
}    

function __destruct()
{
  if(mysql_close($this->link))
    $this->link = null; 
}

Это хорошо работает, моя единственная оговорка в том, что если мне нужно подключить несколько, чтобы несколько раз ударить по базе данных, она будет выполнять несколько соединений и отключений. Если я это сделаю, я вижу, может быть, потенциальные проблемы. Является ли это проблемой или есть лучший способ сделать это? И мой код даже до нюхания вообще?

36 голосов | спросил percent20 20 Jam1000000amThu, 20 Jan 2011 00:02:47 +030011 2011, 00:02:47

5 ответов


16

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

Затем вы можете установить соединение в качестве одноэлементного и, таким образом, только connect & отключите один раз.

Извиняюсь заранее, если я что-то пропустил - мой PHP далеко не свободен.

ответил LRE 20 Jam1000000amThu, 20 Jan 2011 00:10:07 +030011 2011, 00:10:07
17

Вы можете использовать MySQLi (расширение PHP), которое по умолчанию используется вместо MySQL. Это очень просто настроить несколько соединений. Однако вам необходимо знать, какое соединение вы всегда запрашиваете.


Поздравляем с первым вопросом.

ответил rightfold 20 Jam1000000amThu, 20 Jan 2011 00:04:27 +030011 2011, 00:04:27
14

Вы также можете посмотреть встроенную команду php mysql_pconnect (). Это отличается от mysql_connect тем, что он открывает постоянное соединение с БД при первом вызове, и каждый последующий раз проверяет, существует ли существующее соединение с этой базой и использует это соединение. Затем вы должны удалить команду mysql_close из деструктора, поскольку они будут сохраняться между загрузками страниц.

Страница справочника php: http://php.net/manual/en/function.mysql- pconnect.php

ответил Wade Tandy 20 Jam1000000amThu, 20 Jan 2011 00:12:43 +030011 2011, 00:12:43
11

используйте библиотеку абстракции, такую ​​как Pear MDB2 для подключения к базе данных.

Это абстрагирует всю логику соединения от вашего кода, поэтому всегда нужно менять свою базу данных (mysql на SQLite и т. д.), вам не придется менять свой код.

http://pear.php.net/manual/en/package.database.mdb2 .php

ответил cbrulak 20 Jam1000000amThu, 20 Jan 2011 00:32:29 +030011 2011, 00:32:29
9

Я не думаю, что это имеет какое-то значение в отношении подключения к базе данных в рамках конструкции или внутри метода подключения, что я думаю, что вам нужно изменить, это команды die.

Использование die заставляет скрипт останавливать и отправлять 1 небольшое сообщение пользователю, который подумает, что это мусор, и никогда не заходите на свой сайт снова :(: (

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

У вас также может быть поле, в котором говорится: введите адрес электронной почты, и мы отправим вам по электронной почте, когда вы вернетесь в систему, вы получите эту идею.

, так как для кода я бы спустил строки:

class Database
{
    public function __construct($autoconnect = false)
    {
        //Here you would 'globalize' your config and set it locally as a reference.
        if($autoconnect === true)
        {
             $this->connect();
        }
    }

    public function connect()
    {
        if($this->connected() === false)
        {
             $result = $this->driver->sendCommand("connect");
             if($result === true)
             {
                  $this->setConnectionState("active");
                  $this->setConnectionResource($this->driver->sendCommand("get_resource"));
             }else
             {
                 throw new DatabaseConnectionError($this->driver->sendCommand("getDriverError"));
             }
        }
    }
}

Это дает вам больше возможностей в долгосрочной перспективе, так как каждое действие разрешимо в вашем APP, ничто не запускается автоматически по умолчанию.

вы можете просто использовать try, catch блоки, чтобы поддерживать отчет об ошибках.

ответил RobertPitt 20 Jam1000000amThu, 20 Jan 2011 02:31:15 +030011 2011, 02:31:15

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132