我对PDO和OOP都很陌生.我正在尝试编写一个连接到数据库的类,并更新插入并修改它.我有几个问题:
在构造函数中连接到数据库是不错的做法?
一个类是应该更新,插入,修改和连接还是应该分成几个类?
为什么runQuery不起作用?我假设它是因为$ pdo在不同的范围内定义.我怎么能这样工作?
如果该类包含在每个页面的顶部,那么这意味着每次加载新页面时它都会重新连接到数据库,这会导致安全问题吗?
为问题的重载道歉.提前感谢您的任何答案.
<?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)
因为$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来包含类定义.否则,您将在重新声明时遇到许多错误(并且您希望避免这种情况).