我正在尝试学习PDO,并且所有资源都表示"使用PDO,您只需要为每个脚本连接一次。"
我如何确保?我一定要吗?什么是最佳做法?
所以,让我们说我有一个名为DatabaseConnection的PHP文件和类,其中包含我的凭据和诸如此类的东西,以及建立连接的方法:
我是否确保在每个页面/副作用脚本的开头连接到mySQL?
//homepage.php
//create header, body, etc, whatever
//$pdoConnection = DatabaseConnection::CREATE_CONNECTION;
//new Avatar($pdoConnection)
还是在课堂上?
//avatar.php
//class Avatar { ...
//$this->pdoConnection = DatabaseConnection::CREATE_CONNECTION;
换句话说,连接将如何流动?
database.php -> homepage.php -> avatar.php?
database.php -> avatar.php?
有关此主题的任何其他资源?许多人都深入研究PDO,但我找不到广泛的用法示例。
答案 0 :(得分:3)
不是每个人都喜欢单身风格的类,但这是一个解决方案。拥有每个页面中包含的应用程序对象/类。
这个很好的部分是它只在你使用连接时连接,而不是所有页面都需要数据库连接
class App {
private static $PDO_INSTANCE;
public static function getPdoInstance() {
if (!self::$PDO_INSTANCE) {
self::$PDO_INSTANCE= // TODO build pdo connection
}
return self::$PDO_INSTANCE;
}
}
然后使用它
$pdo = App::getPdoInstance();
// do db logic here
除原始答案外
我尝试将所有数据库访问权保留在一组类中,这个通用名称将是"数据访问层"或"数据存储库"。
这些类是唯一需要了解pdo连接的类。
例如
class calendar_page {
function index() {
$dal_calendar = new DalCalendar();
$events = $dal_calendar->getEvents();
// render html using data
}
}
class DataAccessLayer {
private $pdo;
function __construct() {
$this>pdo = App::getPdoInstance();
}
class DalCalendar extends DataAccessLayer {
function getEvents() {
$this->pdo-> // query for events
return $events;
}
}
你传递连接的另一种方法是使用依赖注入,你必须谷歌更多信息,这不是我可以给你一个快速的例子。
答案 1 :(得分:2)
最简单的解决方案是使用Singleton模式。 ¹
这个想法是你有一个带有一个静态方法的类,它返回一个数据库连接的实例。连接将在静态方法的第一次调用中实例化,然后重用。例如:
class MyPDO
{
private static $inst;
public static getInstance()
{
if (!self::$inst)
self::$inst = new PDO(/* your connection details */);
return self::$inst;
}
}
如果要在上下文中使用Singleton,请包含类文件(如果不使用自动加载器),并且可以立即使用PDO实例:
require_once "/path/to/MyPDO.php"; // it’s important to use require_once
$pdo = MyPDO::getInstance();
¹请注意,如今可能会认为Singleton更像是一种反模式,如果可能的话,首选依赖注入。