我只是想要掌握在PHP中使用类的艺术,并且遇到了一个问题。
出于安全考虑,我有时在我的应用程序中使用两个数据库连接;一个具有只读权限,另一个具有完全读/写权限。不幸的是,当我开始构建一些课程时,我并没有真正想到这一点。
所以,我有一个数据库类,它本质上是一个没有意义的PDO包装器(没有意义,因为PDO 是一个包装器),但是认为最好还是编写一个,我可以扩展PDO后来也是如此。这就是我所做的:
<?php
class Database {
private $dbh;
public function __construct($accessLevel = NULL, $credentials = NULL) {
if (gettype($credentials) === 'array') {
$dsn = 'mysql:host='.$credentials['dbHost'].';dbname='.$credentials['dbName'];
$options = array (
PDO::ATTR_PERSISTENT => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
if ($accessLevel == "public") {
$this->dbh = new PDO($dsn, $credentials['publicUser'], $credentials['publicPassword'], $options);
} else if ($accessLevel == "private") {
$this->dbh = new PDO($dsn, $credentials['privateUser'], $credentials['privatePassword'], $options);
}
}
}
// other database functions
}
?>
对于公共连接(读/写),我只是使用了这个:
$db = new Database('public', config['dbConfig']);
...或者对于私人连接(只读),我使用了这个:
$db = new Database('private', config['dbConfig']);
...当我想在另一个类中使用连接时,我只是注入了连接,如下所示:
$user = new User($db);
工作正常,但后来我意识到我可能需要在该类中有两个连接,一个用于只读,一个用于所有。所以我有点困惑,但不管怎样。这就是我所做的:
我没有用任何一个连接调用类,而是用两者调用了两次类,如下所示:
$publicDB = new Database('public', $config['db']);
$privateDB = new Database('private', $config['db']);
然后将这两个注入我的其他班级:
$user = new User($publicDB, $privateDB);
在此User类中,我使用了两个连接:
<?php
class User {
private $dbh;
private $dbhp;
public function __construct($publicDatabase = NULL, $privateDatabase = NULL) {
$this->dbh = $publicDatabase;
$this->dbhp = $privateDatabase;
}
public function doSomething() {
$this->dbh->query("INSERT INTO......");
$this->dbh->execute();
}
public function doSomethingSafely() {
$this->dbhp->query("SELECT * FROM......");
$results = $this->dbhp->resultset();
}
}
?>
是的,这实际上运作正常,但我担心这不是可接受的方法,或者可能会在以后的路上引起问题。我有几个问题:
使用具有不同权限的两个连接仍被视为良好做法吗?即使我正在使用PDO正确转义和验证我的数据并绑定值?
如果上面的是,是否有更好的方法来管理两个连接以便在许多课程中使用或者我已经接受了什么?