PHP PDO类构造

Sha*_*ane 1 php pdo class

我对PDO和OOP都很陌生.我正在尝试编写一个连接到数据库的类,并更新插入并修改它.我有几个问题:

  1. 在构造函数中连接到数据库是不错的做法?

  2. 一个类是应该更新,插入,修改和连接还是应该分成几个类?

  3. 为什么runQuery不起作用?我假设它是因为$ pdo在不同的范围内定义.我怎么能这样工作?

  4. 如果该类包含在每个页面的顶部,那么这意味着每次加载新页面时它都会重新连接到数据库,这会导致安全问题吗?

为问题的重载道歉.提前感谢您的任何答案.

<?php
class Login{

private $_username;
private $_password;
private $_host;
private $_database;
private $_driver;

//Connect to the database

function __construct($configFile){

    $connectionDetails = parse_ini_file($configFile);

    $this->_username = $connectionDetails['username'];
    $this->_password = $connectionDetails['password'];
    $this->_host = $connectionDetails['host'];
    $this->_database = $connectionDetails['database'];
    $this->_driver = $connectionDetails['driver'];

    $pdo = new PDO("$this->_driver:host=$this->_host;dbname=$this->_database", $this->_username, $this->_password);

}

public function loginAllowed($user, $pw){

    $sth = $pdo->setFetchMode(PDO::FETCH_ASSOC);
    print_r($sth);
}

public function runQuery($query, $params){
    $sth = $this->pdo->prepare($query);
    $sth->execute($params); 
}
}
Run Code Online (Sandbox Code Playgroud)

Sty*_*xxy 7

因为$pdo是构造函数和方法中的局部变量loginAllowed.你应该把它变成一个实例变量(private $pdo),这样你就可以调用它$this->pdo.我还建议在这里使用类型提示,将PDO类作为构造函数中的参数.

<?php
class Login {
    private $pdo;
    // Your other instance variables

    public function __construct(PDO $pdo)
    {
        $this->pdo = $pdo;
    }

    // Your other methods
}

$pdo = new PDO("...");
$login = new Login($pdo);
Run Code Online (Sandbox Code Playgroud)

您不应该通过阅读设置和初始化数据库连接来打扰您的课程(绝对阅读关注点的分离),让它远离您的课堂.只需将PDO对象作为参数给出(我使用了类型提示,这样就不得不提供PDO类型的对象).另一个优点是,您现在可以确保只有一个活动数据库连接(您可以在代码库中进行管理),创建多个连接是不必要的,绝对不需要(性能明智).

还可以使用require_once来包含类定义.否则,您将在重新声明时遇到许多错误(并且您希望避免这种情况).