【问题标题】:PDO PHP MYSQL OOP Advice and How toPDO PHP MYSQL OOP 建议和操作方法
【发布时间】:2016-02-12 06:12:19
【问题描述】:

让我解释一下我要做什么。

  1. 我制作了一个 db.config.php 文件,其中包含所有数据库详细信息并建立了连接。
  2. 我制作了另一个 db.connect.php 文件,它只通过调用函数在 db.config 文件中建立连接来建立连接,因此两个文件之间的唯一区别是 db.config.php 包含连接信息,如dbname 等,而 db.connect.php 没有。
  3. 我想要做的是,现在我需要连接到数据库的任何地方都应该使用 db.connect.php 文件来完成。
  4. 我正在做的事情是否安全且是正确的做事方式?
  5. 代码如下

    db.config.php

    <?php
    class Database{
    private $DB_host = 'localhost';
    private $DB_name = 'db_pdo';
    private $DB_user = 'root';
    private $DB_pass = 'secret';
    public $conn;
    
    public function makeConnection(){
        $this->conn = null;
        try{
            $this->conn = new PDO("mysql:host=".$this->DB_host.";dbname=".$this->DB_name,$this->DB_user,$this->DB_pass);
        }
        catch(PDOException $e){
            echo "Connection error:- ".$e->getMessage();
        }
        return $this->conn;
    }
    

    }

db.connect.php

    <?php
    include_once 'db.config.php';
    class Connect{
    public $database;
    public $db;

    public function __construct()
    {
        $database = new Database();
        $db = $database->makeConnection();

        if($db){
            return $db;
        }
        else{
            echo "Connection Failed";
        }
    }
}

现在我想要的是假设我用 Class 说 Test 创建一个新的 PHP 文件, 如何仅使用 db.connect.php 文件进行连接?

这真的像我被告知的那样为应用程序增加了额外的安全级别吗?

另外,如果我正在做的事情是不必要的,请告诉我。 谢谢。

【问题讨论】:

  • 与什么相关的额外安全性?仍然可以从任何其他脚本中访问数据库凭据(无论如何这 afaik 是不可避免的)。

标签: php mysql database oop pdo


【解决方案1】:

这真的像我被告知的那样为应用程序增加了额外的安全级别吗?

不,它没有。事实上,除了不必要的复杂性之外,它并没有增加任何东西。

一旦我可以在机器上运行代码,就有很多方法可以检索 (private) 凭据。

只需在需要时首先创建PDO 对象,然后将其传递给需要它的对象。将PDO 包装在像上面这样的额外类中是没有用的。

还考虑到这个问题被标记为 OOP:

您应该始终尽量避免在其他类中创建实例(在大多数情况下使用 new 关键字),因为这会引入紧密耦合并因此使您的代码更难进行单元测试。

我正在做的事情是否安全且是正确的做事方式?

不如上面所说的那么合适。

安全,这取决于您要防止什么以及您的其余设置是什么样的(例如,您的文档根目录中没有敏感文件等)。但是,您的共享代码在安全方面并没有多大作用(如果有的话)。

最后,Connect 类的构造函数尝试返回一些没有任何意义的 $db。构造函数总是返回一个自身的实例。

在使用 mysql 引擎设置 PDO 实例时,使用真正正确的准备好的语句而不是默认使用的模拟语句可能有助于安全性。为此,请设置正确的选项:

$dbConnection = new PDO("mysql:host=".$DB_host.";dbname=".$DB_name.";charset=utf8",$DB_user,$DB_pass);
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

另外请注意,我还设置了用于连接的编码。

数据库连接的实际设置可以保存在某个配置文件中,或者作为网络服务器的环境变量,也可以作为配置文件保存在文档根目录外部的某个位置。

【讨论】:

    【解决方案2】:

    这完全是矫枉过正。您实例化两个类,唯一的结果是一个 PDO 对象,之后不再使用类 Connect 和 Database。您可以完全删除它们并仅使用这些行,结果相同:

    $DB_host = 'localhost';
    $DB_name = 'db_pdo';
    $DB_user = 'root';
    $DB_pass = 'secret';
    $db = new PDO("mysql:host=".$DB_host .";dbname=".$DB_name,$DB_user,$DB_pass);
    

    包含此文件并在之后使用$db

    【讨论】:

      【解决方案3】:

      每次连接数据库时都需要包含db.connect.php

      不,它没有增加任何级别的安全性,更多的是关于可重用性,如果你想更改密码,你只需在一个地方更改它。

      【讨论】:

        猜你喜欢
        • 2013-03-12
        • 2016-12-27
        • 1970-01-01
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-16
        相关资源
        最近更新 更多