0

我现在正在使用 PDO,并且我有很多课程。每次我使用一个类时,我并不总是使用它与数据库相关的功能。有时我会一直使用一个类,直到最后我可能会对数据库做一些工作,比如将此对象保存到 DB。

所以我目前正在做这样的事情:

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 连接数 - 最大连接数

我在一个页面上最多有三个相关对象,有时我会这样做,有时我不需要在一个页面上多次连接到数据库。哪种设计更安全?

4

2 回答 2

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);
    }
 }

检查这个问题

于 2013-05-18T14:34:18.617 回答
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方法将存储该连接,就像会话工作一样,并且会不断提供您的页面,并帮助您在每次刷新时创建与数据库的新连接页,或转到另一页。试试看,它.. 你会看到你的页面加载速度有多快。

于 2013-05-18T14:37:54.447 回答