PHP数据库类-管理具有不同权限的两个连接

PHP数据库类-管理具有不同权限的两个连接,php,Php,我只是想掌握在PHP中使用类的艺术,遇到了一个问题 出于安全原因,我有时在应用程序中使用两个数据库连接;一个具有只读权限,另一个具有完全读/写权限。不幸的是,当我开始构建一些类时,我并没有真正考虑到这一点 所以,我有一个数据库类,它本质上是一个无意义的PDO包装器,因为PDO是一个包装器,但我认为编写一个数据库类是一个很好的实践,以后我可能还会扩展PDO。这就是我所做的: <?php class Database { private $dbh; public funct

我只是想掌握在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']);
工作很好,但后来我意识到我可能需要两个类内的连接,一个用于阅读,一个用于所有。所以我有点困惑,但还是尝试了一下。这就是我所做的:

<?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

}
?>
我没有使用任何一个连接调用该类,而是使用这两个连接调用了该类两次,如下所示:

$user = new User($db);
$publicDB = new Database('public', $config['db']);
$privateDB = new Database('private', $config['db']);
然后把这两个都注入到我的另一个班级:

$user = new User($publicDB, $privateDB);
在这个用户类中,以下是我如何使用两个连接:

<?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绑定值

如果上面的回答是肯定的,那么有没有更好的方法来管理这两个连接,以便在许多类中使用,或者我所做的是可以接受的


使用两个具有不同权限的连接是否仍被视为良好做法对于相同的数据?究竟为什么这会是一种好的做法?似乎没有什么好的理由,你在增加一笔荒谬的开销。@CollinGrady,不是相同的数据,不是。我对所有select查询使用只读特权连接,对所有insert、update和delete查询使用读/写连接。我猜想,这是一种用来阻止人们注入SQL和修改数据库的方法。如果他们没有权限,但成功地注入了SQL,那么除了选择记录之外,造成的伤害最小;我不认为这是一个好的实践。但是,如果您真的想这样做,我会让您的数据库类具有读写函数,而不是携带它的两个实例;然后只需传递一个db对象,函数$db->read或$db->write as needed我不同意没有充分的理由建立单独的连接。例如,针对URL中的搜索字段、登录表单甚至页面ID字段的SQL注入攻击的可能性。如果查询仅通过只读连接运行,则不可能运行具有灾难性影响的查询。您不会受到数据过滤的保护,因此这不是不正确处理传入数据的借口,但它限制了暴露。