PDO PHP MYSQL OOP建议和如何

PDO PHP MYSQL OOP建议和如何,php,mysql,database,oop,pdo,Php,Mysql,Database,Oop,Pdo,让我解释一下我想做什么 我创建了一个db.config.php文件,其中包含所有数据库详细信息并建立了连接 我制作了另一个db.connect.php文件,它只通过调用函数在db.config文件中建立连接来建立连接,因此这两个文件之间的唯一区别是db.config.php包含dbname等连接信息,而db.connect.php不包含 我想做的是,现在无论我在哪里需要连接到数据库,都应该使用db.connect.php文件来完成 我所做的是安全的,是一种正确的做事方式吗 代码如下 db.con

让我解释一下我想做什么

  • 我创建了一个db.config.php文件,其中包含所有数据库详细信息并建立了连接
  • 我制作了另一个db.connect.php文件,它只通过调用函数在db.config文件中建立连接来建立连接,因此这两个文件之间的唯一区别是db.config.php包含dbname等连接信息,而db.connect.php不包含
  • 我想做的是,现在无论我在哪里需要连接到数据库,都应该使用db.connect.php文件来完成
  • 我所做的是安全的,是一种正确的做事方式吗
  • 代码如下

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


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

    这完全是过火了。实例化两个类,唯一的结果是一个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

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

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

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

    只要在需要时首先创建
    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);
    
    还要注意,我还设置了用于连接的编码


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

    与什么相关的额外安全性?数据库凭据仍然可以从任何其他脚本中访问(afaik无论如何都是不可避免的)。
    $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);
    
    $dbConnection = new PDO("mysql:host=".$DB_host.";dbname=".$DB_name.";charset=utf8",$DB_user,$DB_pass);
    $dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);