首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在单独的类中配置MySQL数据库

在单独的类中配置MySQL数据库
EN

Stack Overflow用户
提问于 2009-07-29 20:06:21
回答 4查看 5K关注 0票数 2

是否可以将所有与数据库相关的配置(主机名、用户名、密码和数据库)以及用于连接和选择正确数据库的函数保留在单独的类中?

我尝试了这样的东西:

代码语言:javascript
复制
class Database
{
    var $config = array(
        'username' => 'someuser',
        'password' => 'somepassword',
        'hostname' => 'some_remote_host',
        'database' => 'a_database'
    );
    function __construct() {
        $this->connect();
    }
    function connect() {
        $db = $this->config;
        $conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
        if(!$conn) {
            die("Cannot connect to database server"); 
        }
        if(!mysql_select_db($db['database'])) {
            die("Cannot select database");
        }
    }
}

然后在另一个类中,我将在类__construct函数中使用:

代码语言:javascript
复制
require_once('database.php');
var $db_conn = new Database();

但这并不能保存连接,它最终默认使用服务器的本地数据库连接。或者在执行某些数据库命令之前,我必须每次都执行数据库命令?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-29 21:19:43

我修改了你的类,让它像你期望的那样工作:

代码语言:javascript
复制
<?php
class Database
{
    var $conn = null;
    var $config = array(
        'username' => 'someuser',
        'password' => 'somepassword',
        'hostname' => 'some_remote_host',
        'database' => 'a_database'
    );

    function __construct() {
        $this->connect();
    }

    function connect() {
        if (is_null($this->conn)) {
            $db = $this->config;
            $this->conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
            if(!$this->conn) {
                die("Cannot connect to database server"); 
            }
            if(!mysql_select_db($db['database'])) {
                die("Cannot select database");
            }
        }
        return $this->conn;
    }
}

用法:

代码语言:javascript
复制
$db = new Database();
$conn = $db->connect();

请注意,您可以根据需要多次调用connect(),它将使用当前连接,如果当前连接不存在,则创建一个连接。这是一个的好东西

另外,请注意,每次使用实例化数据库对象(使用)时,都会创建一个到数据库的新连接。我建议您考虑将数据库类实现为Singleton,或者将其存储在Registry中以供全局访问。

你也可以用肮脏的方式把它塞进$GLOBALS。

编辑

我擅自修改了您的类以实现单例模式,并遵循PHP5 OOP约定。

代码语言:javascript
复制
<?php
class Database
{
    protected static $_instance = null;

    protected $_conn = null;

    protected $_config = array(
        'username' => 'someuser',
        'password' => 'somepassword',
        'hostname' => 'some_remote_host',
        'database' => 'a_database'
    );

    protected function __construct() {
    }

    public static function getInstance()
    {
        if (null === self::$_instance) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function getConnection() {
        if (is_null($this->_conn)) {
            $db = $this->_config;
            $this->_conn = mysql_connect($db['hostname'], $db['username'], $db['password']);
            if(!$this->_conn) {
                die("Cannot connect to database server"); 
            }
            if(!mysql_select_db($db['database'])) {
                die("Cannot select database");
            }
        }
        return $this->_conn;
    }

    public function query($query) {
        $conn = $this->getConnection();
        return mysql_query($query, $conn);
    }
}

用法:

代码语言:javascript
复制
$res = Database::getInstance()->query("SELECT * FROM foo;");

代码语言:javascript
复制
$db = Database::getInstance();
$db->query("UPDATE foo");
$db->query("DELETE FROM foo");
票数 7
EN

Stack Overflow用户

发布于 2009-07-29 20:15:58

你当然可以将你的连接信息保存在一个单独的文件中。

只需将连接对象-- connect()函数中的$conn --保存在一个类变量中。然后,您将能够在调用之间重用它。

票数 0
EN

Stack Overflow用户

发布于 2009-07-29 20:17:08

在您的方法connect()中,$conn只是一个局部变量,仅存在于该方法的作用域中。一旦方法返回,就不会有对连接资源的(其他)引用,它将被收集/释放。你至少需要

代码语言:javascript
复制
$this->conn = mysql_connect(...)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1202712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档