PDO PHP MYSQL OOP建议和方法

时间:2015-11-11 07:06:35

标签: php mysql database oop pdo

让我解释一下我要做的事情。

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

    }

  6. 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 say一个新的PHP文件, 如何仅使用db.connect.php文件进行连接?

    当我被告知时,这是否真的为应用程序增加了额外的安全性?

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

  

当我被告知时,这是否真的为应用程序增加了额外的安全性?

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

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

首先在需要时创建PDO对象并将其传递给需要它的东西。将PDO包含在上面的额外类中是没用的。

同时考虑这个问题是标记为OOP:

你应该总是试图阻止在其他类中创建实例(在大多数情况下使用new关键字),因为这会引入紧密耦合并使单元测试你的代码更加困难。

  

我的安全和正确的做事方式是什么?

正确的不如上所述。

安全,这取决于您要阻止的内容以及您设置的其余内容(例如,您的doc根目录中没有敏感文件等)。但是它的安全条款是你的共享代码并没有做太多的事情(如果有的话)。

最后,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);

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

db连接的实际设置可以保存在某个配置文件中某处作为Web服务器的环境变量,或者作为配置文件保存在外部文档根目录。