2013-05-18 3 views
0

Теперь я использую PDO, и у меня есть несколько классов. Каждый раз, когда я использую класс, я не всегда использую его связанные с базой данных функции. Иногда я продолжаю использовать класс, пока в конце я не смогу выполнить некоторую работу с базой данных, например, сохранить этот объект в БД.Позиция подключения pdo в php-классе

Так что я сейчас делаю что-то вроде этого:

class Something 
{ 
    protected $pdo; 

    function connect() 
    { 
     $this->pdo = new PDO("mysql:host=".zConfig::read('hostname').";dbname=".zConfig::read('database'), zConfig::read('username'), zConfig::read('password')); 
     $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 

    /* lots of functions doing lots of non-DB things */ 

    function saveToDB() 
    { $this->connect(); 
      $this->pdo->prepare("Some SQL that saves some stuff"); 
      // now do some DB-related pdo work 
    } 

} 

Мой вопрос - это это разумно? Это так много из вас код?

Как я вижу, есть 3 варианта:

  1. То, как я это делаю - подключение к базе данных только в тех функций, связанных с базами данных. Но эти средства каждый время Я запускаю функцию, связанную с БД.
  2. Открыть соединение в конструкторе, в этом случае я его открываю только один раз, но и заканчиваю тем, что открываю его, даже когда он мне не нужен, поэтому я чувствую, что иногда я создаю связи для ничего.
  3. С другой стороны, я мог бы использовать одноэлементный класс базы данных, как это:

    PDO Connections - max connections

У меня есть до трех связанных объектов на странице, а иногда я делаю, и иногда я не нужно подключаться к БД более одного раза на странице. какой дизайн безопаснее?

ответ

2

Вы должны использовать DI, в классе для создания экземпляра соединения, когда ваш объект определяется например:

class foo{ 
    public $conn; 

    function __construct($conn){ 
    $this->conn = $conn; 
    } 

    function doSomething(){ 
    } 
} 

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

ATT_PERSISTENT свойство, как:

$conn = new PDO('mysql:host=localhost;dbname=xxx', 'xxx', 'xxx', 
       array(PDO::ATTR_PERSISTENT => true) 
     ); 

$object = new foo($conn); 

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

+0

Что такое "DI"? Я не совсем понимаю, что вы имеете в виду. Когда будет использоваться второй фрагмент кода? Предположим, что я на странице, где я создаю объект 'Product'. И я долгое время буду использовать этот объект на странице, но в конце мне нужно его сохранить, как этот '$ product-> save();' Так, если я запустил страницу с помощью '$ p = new Продукт; $ p-> setVals (некоторые значения); ', что мне делать в конце страницы и когда я должен добавить ваш второй код с помощью' ATT_PERSISTENT'? – user961627

+1

, что касается 'ATTR_PERSISTENT', вы можете добавить его в любом месте, не беспокойтесь об этом.Как я уже сказал, это немного похоже на сеансы, просто откройте его один раз, и он будет продолжать поддерживать атрибут соединения на вашей странице, и соединение будет завершено один раз, вы закроете страницу. Теперь DI - это сокращение от Injection Dependency. вы можете использовать его или просмотреть [this] (http://blog.ircmaxell.com/2013/01/dependency-injection-programming-with.html), чтобы получить представление. Это очень важный способ обработки соединений, которые существуют сегодня – samayo

2

Вы можете просто использовать ленивый путь.

protected $pdo; 

function connect() 
{ 
if ($this->pdo === null) 
    { 
    $this->pdo = new PDO("mysql:host=".zConfig::read('hostname').";dbname=".zConfig::read('database'), zConfig::read('username'), zConfig::read('password')); 
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    } 
} 

Проверить this question.

Смежные вопросы