繁体   English   中英

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

[英]MySQL database config in a separate class

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

我尝试过这样的事情:

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类中使用该函数:

require_once('database.php');
var $db_conn = new Database();

但这不会保存连接,最终会默认为服务器本地数据库连接。 还是在执行某些数据库命令之前必须每次都要执行数据库命令?

我修改了您的班级,使其正常工作,就像您期望的那样:

<?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;
    }
}

用法:

$db = new Database();
$conn = $db->connect();

请注意,您可以多次调用connect(),它将使用当前连接;如果不存在,则创建一个。 这是一件好事

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

您也可以以肮脏的方式进行操作,并将其推入$ GLOBALS中。

编辑

我随意修改您的类以实现Singleton模式,并遵循PHP5 OOP约定。

<?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);
    }
}

用法:

$res = Database::getInstance()->query("SELECT * FROM foo;");

要么

$db = Database::getInstance();
$db->query("UPDATE foo");
$db->query("DELETE FROM foo");

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

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

在您的方法中,connect()$ conn只是一个仅存在于该方法范围内的局部变量。 一旦该方法返回,将没有(其他)对连接资源的引用,并且将对其进行收集/处置。 您至少需要

$this->conn = mysql_connect(...)

这是带有PDO的单例示例。 感谢@hodobave

<?php 

/**
 * DB Connection class
 * Singleton pattern
 * An single instance of DB connection is created
**/

class Db{

    protected static $_instance = null;
    protected $_conn;

    protected $_config = [
        'username' => 'root',
        'password' => '',
        'hostname' => 'localhost',
        'database' => 'news',
    ];
    protected function __construct(){

    }

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

    public function getConnection(){
        if(is_null($this->_conn)){
            //connect here
            $db = $this->_config;
            $dsn = "mysql:host={$db['hostname']};dbname={$db['database']}";
            $this->_conn = new PDO($dsn, $db['username'], $db['password']);
        }
        return $this->_conn;
    }

    public function query($sql){
        $args = func_get_args();
        array_shift($args);
        $statement = $this->getConnection()->prepare($sql);
        $statement->execute($args);
        return $statement->fetchAll(PDO::FETCH_OBJ);
    }
}



$res = Db::getInstance();
$users = $res->query("SELECT * FROM `user` WHERE id=?",1);
print_r($users);
?> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM