【问题标题】:MySql + oop PHP - how should I use mysql?MySql + oop PHP - 我应该如何使用mysql?
【发布时间】:2023-03-18 09:00:01
【问题描述】:

我想知道我是否使用 mysql 和 php 安全。这是我的课:

class DB{
    public $mysqli = null;
    public $result = array();

    private $_host = 'localhost';
    private $_user = 'root';
    private $_password = 'root';
    private $_db_name = 'DBNAME';

    public function __construct()
    {
        $this->mysqli = new mysqli($this->_host,$this->_user, $this->_password, $this->_db_name);

        if ($this->mysqli->connect_errno){
            echo "Error MySQLi: ("&nbsp. $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error;
            exit();
        }

        $this->mysqli->set_charset("utf8");
    }

    public function __destruct(){
        $this->mysqli->close();
    }

    public function query($query){
        $this->result = $this->mysqli->query($query);

        if($this->result){
            return $this->result;
        }else{
            return false;
        }
    }

这种方式与数据库通信是否足够好,或者我应该使用 Doctrine 吗?

我问是因为我的代码中有一些奇怪的东西。如果我 vardump 任何对象包含对 DB 对象的引用,我可以看到:

["_host":"DB":private]=> 字符串(9) "localhost" ["_user":"DB":private]=> 字符串(4) "root" ["_password":"DB":private]=> string(4) "root" ["_db_name":"DB":private]=> string(10) >"DBNAME" }

【问题讨论】:

  • 如果你打印对象来查看这个数据是正常的。你的类是一个普通的扩展包装器。安全性伴随着复杂的查询和你的班级“准备”它们的能力——捕捉可能的注入等等(简单地说)。

标签: php mysql oop


【解决方案1】:

如果您担心 var_dump 上显示的数据库设置,我建议您将这些设置放在配置文件中并将这些配置作为参数发送。

就个人而言,我不会担心。如果有人可以访问您的对象(可能是另一个共享对象),他们可能有能力读取您的设置。我看到拥有配置文件的唯一好处是您可以更新这些配置而无需接触 php 代码库。

您认为这会是一个问题吗?

另外你的代码结构很好,保持它从 mysqli 中提取,不要切换到扩展。如果您决定切换到 PDO 或出现的任何其他更好的扩展,这将为您提供灵活性。

【讨论】:

    【解决方案2】:

    为什么要重新发明轮子?您的 query 函数几乎可以完成 mysqli_query 已经为您做的事情。我会使用基本的mysqli 类,就像你已经在做的那样,让这个类扩展那个类

    class DB extends mysqli {
        private $_host = 'localhost';
        private $_user = 'root';
        private $_password = 'root';
        private $_db_name = 'DBNAME';
    
        public function __construct()
        {
            parent::__construct($this->_host,$this->_user, $this->_password, $this->_db_name);
        }
    }
    

    【讨论】:

    • 是的,我知道,但我很担心:["_host":"DB":private]=> string(9) "localhost" ["_user":"DB":private] => 字符串(4) "root" ["_password":"DB":private]=> 字符串(4) "root" ["_db_name":"DB":private]=> 字符串(10) >"DBNAME" }
    【解决方案3】:

    您的问题类似于“我应该戴帽子还是帽子?”。
    实际上,没有最好的方法来处理数据库。这取决于你的女巫方法。
    如果您更喜欢编写 SQL 代码,那么您的解决方案很好,并且非常适合您的使用。
    但是,如果您不想编写 SQL 查询并且只使用对象,那么您会更喜欢使用学说。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多