这是一个安全的OO php数据库连接还是浪费代码


Is this a secure OO php database connection or a waste of code

所以我已经编程了一段时间,并决定学习OOP。我为数据库连接创建了这个类,我不确定这是浪费代码还是一种好的方法。我仍然觉得我不太了解OOP,但我会做到的,这只是练习。我想我的目标实际上是尽可能多地将数据库连接保留为该类的私有连接,并让该类像mysqli_close();一样进行所有清理;。

class db {
private $db_user;
private $db_pass;
private $db_host;
private $db_name;
private $link;
private $db_error;
public function escape($string) {
    return mysqli_real_escape_string($this->link, $string);
}
public function query($query) {
    return = mysqli_query($this->link, $query);
}
function __construct() {
    $this->db_error = 'Database Error';
    $this->db_user = 'root';
    $this->db_pass = '';
    $this->db_host = 'localhost';
    $this->db_name = 'test';
    $this->link = mysqli_connect($this->db_host, $this->db_user, $this->db_pass) or die($this->db_error);
    mysqli_select_db($this->link, $this->db_name) or die($this->db_error);
}
function __destruct() {
    mysqli_close($this->link);
}

}

编辑:谢谢你的回答,我将学习PDO。

这本身并没有错,只是因为它无法支持准备好的语句,因此容易被利用,但它也不是一件有用的事情;PHP的PDO类是您要搜索的轮子。

我认为这是个好主意。最好将所有数据库功能封装在一个类中。

一些建议:

  1. 在构造函数中发送连接参数。因此,您可以在其他项目中轻松地重用它
  2. 使用已准备好的语句,因此转义字符串变得多余
  3. mysqli_query也可能失败,您需要处理它

我想对你的问题发表评论,但我没有足够的声誉,所以我只会指出我的想法作为答案。

你所做的基本上是试图编写一个包装器——这绝对没问题。但正如其他人所指出的,最好包装PDO函数,因为它们提供了准备好的语句来处理任何SQL注入尝试,并且在未来得到了完全支持。

我看到的另一个问题是,您正在初始化MySQL登录凭据并将其存储在对象中。由于它们现在在内存中,所以这些信息是公开的,并且可以检索。

我建议您将MySQL登录信息存储在一个配置文件中,例如(.ini),并在调用mysqli_connect()函数时读取它。不要将这些数据存储在类成员变量中。

如果您决定将登录信息存储为本地变量(也许是为了使用有意义的变量名使代码更清晰),请确保在调用mysqli_connect()后将其清空。