在index.php文件

时间:2016-04-25 21:47:54

标签: php mysql database pdo

我在index.php文件中有一个到数据库的PDO连接。

$servername = "localhost";
$username = "root";
$password = "";
$dbname = "dbname";
$dbh_conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$dbh_conn->exec("set names utf8");
$dbh_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbh_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

我网站的几乎所有页面都需要数据库。还有一些页面不需要数据库,但因为所有页面都从index.php传递,然后该连接才会执行。我的意思是所有页面(即使是那些不需要数据库的页面)还有一个数据库连接。

这是件坏事吗?我应该改变我的所有结构吗?同样,大多数页面都需要数据库,其中只有少数几个没有。那我做得好吗?

1 个答案:

答案 0 :(得分:1)

您需要为数据库连接创建一个singleton类,而不仅仅是运行代码。

class DB {
    private static $instance;
    private $_dbh_conn = null;

    public static function getInstance() {
        if (null === static::$instance) {
            static::$instance = new static();
        }

        return static::$instance;
    }

    protected function __construct() { 
        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "dbname";
        $this->_dbh_conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
        $this->_dbh_conn->exec("set names utf8");
        $this->_dbh_conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
        $this->_dbh_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }

    public function &dbh_conn() {
        return $this->_dbh_conn;
    }

    private function __clone() { }
    private function __wakeup() { }
}

当您包含此文件时,您需要获得如下连接:

$dbh_conn = DB::getInstance()->dbh_conn(); 

现在,您可以在$dbh_conn中与数据库建立连接,并且可以像直到现在一样使用它。唯一的区别是,现在您可以包含此文件,但它不会连接到数据库,除非您使用Singleton类DB并特别请求数据库连接(就像我在上面的示例中所做的那样)。另外一个好处是,您可以在整个脚本运行时获得相同的数据库连接,因为您使用单例类的设计模式来获得连接。