让我解释一下我要做什么。
- 我制作了一个db.config.php文件,其中包含所有数据库详细信息并建立了连接
- 我制作了另一个db.connect.php文件,它只通过调用db.config文件中的函数来建立连接,因此这两个文件之间的唯一区别是db.config.php包含dbname等连接信息,而db.connect.php不包含
- 我想做的是,现在我需要连接到数据库的任何地方都应该使用db.connect.php文件
- 我所做的事情是否安全,是否是一种恰当的做事方式
-
代码如下
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 say Test创建一个新的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
。
每次连接到数据库时,都需要包含db.connect.php
。
不,它并没有增加任何级别的安全性,它更多的是关于可重用性,比如说,如果你想更改密码,你只需要在一个地方更改它。
这真的像我被告知的那样为应用程序增加了额外的安全级别吗?
不,没有。事实上,除了不必要的复杂性之外,它没有增加任何东西。
一旦我可以在机器上运行代码,就有很多方法可以检索(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);
还要注意,我还设置了用于连接的编码。
数据库连接的实际设置可以保存在某个配置文件中,或者作为Web服务器的环境变量,或者作为文档根目录外的配置文件。