1

我对 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); 
}
}
4

4 回答 4

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);

您不应该通过阅读设置和初始化数据库连接来打扰您的班级(绝对阅读有关关注点分离的内容),将其排除在您的班级之外。只需将 PDO 对象作为参数提供(我使用了类型提示,这样您就被迫提供该PDO类型的对象)。另一个优点是您现在可以确保您只有一个活动的数据库连接(您可以在您的代码库中管理它),创建多个连接是不必要的并且绝对不需要(性能方面)。

还使用require_once来包含您的类定义。否则,您将收到许多有关重新声明的错误(并且您希望避免这种情况)。

于 2012-05-02T06:45:37.557 回答
1
  1. 在您认为最方便的地方连接到数据库。只需尝试确保只有一个连接。与同一个数据库的更多连接是浪费时间和资源。

  2. 您引用的类在 MVC 体系结构中称为模型。它通常对给定表执行所有操作。我认为使用单个类来满足您的所有需求并没有错——只要代码是可读和可维护的。

  3. 它不起作用,因为它$pdo是一个局部变量。在 ctor 中,$this->pdo改为实例化。

  4. 包含一个类并不等同于实例化它。一个新实例将建立另一个连接。多次包含它只会给你一个多重声明错误:)。改为使用require_once。如果您希望在多个文件中使用该实例,我强烈建议您对 Singleton 模式进行快速搜索。使用单例对象将确保您始终只有一个模型对象实例。

于 2012-05-02T06:52:39.167 回答
1

不要打扰所有随机的东西,只需在你的构造中替换它:

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

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

并从现在开始将其引用为 $this->pdo。就如此容易!!

于 2012-07-14T06:00:51.400 回答
0

1)在构造函数中连接数据库是好的做法吗?

不好,查询前先连接

if($this->pdo == null) {
$this->pdo = new PDO("....");

}

2) 一个类应该更新、插入、修改和连接,还是应该分成几个类?为类添加方法

3) 为什么 runQuery 不工作?我假设它是因为 $pdo 是在不同的范围内定义的。我将如何让这个工作?改用 $this->pdo

4) 如果该类包含在每个页面的顶部,这是否意味着每次加载新页面时它都会重新连接到数据库,这会导致安全问题吗?使用 static $pdo 然后 self::$pdo 将是唯一的一个连接器

if(self::$pdo == null) {
self::$pdo = new PDO("....");

}

于 2012-05-02T07:13:16.770 回答