【问题标题】:Creating new mysql connection object every time I need something每次我需要一些东西时创建新的 mysql 连接对象
【发布时间】:2015-07-10 22:38:07
【问题描述】:

我是PHP 的新手,我正在尝试完成这个简单的任务:从MySql 数据库获取数据。

我创建了一个单例类来与数据库通信:

class Database {
    private static $db = null;
    private $servername;
    private $username;
    private $password;
    private $connection;

    private function Database(){
        $this->servername = "localhost"; 
        $this->username = "user";
        $this->password = "123456";
    }

    public static function get_database(){
        if(!static::$db){
            static::$db = new Database();
        }
        return static::$db;
    }

    function start_connection(){
        $this->connection = new mysqli($this->servername, 
                                       $this->username, 
                                       $this->password);
    }

    function execute_query($query){
        $this->start_connection();

        [...]

        $this->disconnect();
    }

    function disconnect(){
        $this->connection->close();
    }

    [...]
}

这段代码运行良好,但有一件事让我很困扰。我想知道我是否真的需要在每次调用start_connection() 时创建一个新的连接对象new mysqli()。有reconnect之类的吗?

【问题讨论】:

  • 这完全取决于您。大多数人只是在构造函数中连接到数据库一次,然后将该连接重新用于所有内容。但一般来说,如果您需要使用不同的凭据访问数据库,您唯一需要多次连接到数据库的时间。
  • 你听说过“单例”模式吗?也许你可以在你的数据库类中使用类似的东西。
  • @Mindastic - 这几乎是一个使用 get_database() 代替“标准”getInstance() 的单例模式 - 正如问题中的 OP 所述......虽然我认为单例模式不一定是数据库处理程序(会话处理程序,是的)的正确选择,因为您可能想要连接到不同的数据库服务器(例如,www 服务器 db 和 newsletter/mailserver db 在同一个脚本中从“我的帐户”类型页面管理时事通讯订阅)
  • @CD001 你是完全正确的。当我最初阅读这个问题时,我不知道为什么我错过了“get_database”。请忽略我之前的评论。感谢您指出。
  • 我从未真正尝试过,因为我倾向于让 db 连接在脚本结束时自行终止,但您可以(理论上)连接到数据库__construct() 函数并在__destruct() 函数中断开与数据库的连接;这样,当您的对象被终止时,它也应该终止连接(并释放资源指针)。

标签: php mysql oop


【解决方案1】:

您可以在 Database 类中存储一个 mysqli 实例并在“私有函数数据库”函数中声明它(如果您愿意,可以调用 $this->start_connection())

如果你愿意,你也可以提供一个静态函数来关闭连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多