我在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
传递,然后该连接才会执行。我的意思是所有页面(即使是那些不需要数据库的页面)还有一个数据库连接。
这是件坏事吗?我应该改变我的所有结构吗?同样,大多数页面都需要数据库,其中只有少数几个没有。那我做得好吗?
答案 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
并特别请求数据库连接(就像我在上面的示例中所做的那样)。另外一个好处是,您可以在整个脚本运行时获得相同的数据库连接,因为您使用单例类的设计模式来获得连接。