Конфигурация базы данных MySQL в отдельном классе - PullRequest
2 голосов
/ 30 июля 2009

Можно ли сохранить всю конфигурацию, связанную с моей базой данных (имена хостов, имена пользователей, пароли и базы данных), а также функцию для подключения и выбора правильной базы данных в отдельном классе?

Я пробовал что-то вроде этого:

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();

Но это не сохраняет соединение, оно в конечном итоге устанавливается по умолчанию на локальное соединение БД с серверами. Или мне нужно выполнять команды базы данных каждый раз перед выполнением некоторых команд базы данных?

Ответы [ 4 ]

7 голосов
/ 30 июля 2009

Я изменил ваш класс, чтобы он работал так, как вы этого ожидаете:

<?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 () столько раз, сколько захотите, и он будет использовать текущее соединение, или создать его, если оно не существует. Это хорошая вещь .

Также обратите внимание, что каждый раз, когда вы создаете экземпляр объекта базы данных (используя new), вы будете создавать новое соединение с базой данных. Я предлагаю вам изучить реализацию класса Database как Singleton или сохранить его в Registry для глобального доступа.

Вы также можете сделать это грязным способом и запихнуть это в $ GLOBALS.

Редактировать

Я позволил себе модифицировать ваш класс для реализации шаблона Singleton и следовать соглашениям ООП PHP5.

<?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");
0 голосов
/ 14 октября 2016

Вот пример синглтона с 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);
?> 
0 голосов
/ 30 июля 2009

В вашем методе connect () $ conn - это только локальная переменная, которая существует только в области действия этого метода. Как только метод вернется, не будет (другой) ссылки на ресурс соединения, и он будет собран / удален. Вам понадобится как минимум

$this->conn = mysql_connect(...)
0 голосов
/ 30 июля 2009

Вы можете хранить информацию о вашем соединении в отдельном файле.

Просто сохраните ваш объект соединения - $ conn в вашей функции connect () - в переменной класса. После этого вы сможете повторно использовать его в звонках.

...