1

所以我编程了一段时间,决定学习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 的答案。

4

3 回答 3

3

它本身并没有错,除了它不支持准备好的语句并因此容易被利用,但这也不是花时间做的有用的事情;PHP 的 PDO 类是您正在搜索的轮子。

于 2013-06-27T19:39:11.223 回答
0

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

一些建议:

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

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

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

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

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

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

于 2013-06-27T20:44:48.900 回答