Ayrı bir sınıfta MySQL veritabanı yapılandırma

2 Cevap php

Bağlanabilir ve ayrı bir sınıfta doğru veritabanını seçmek için tüm veritabanı ile ilgili yapılandırma (hostname, kullanıcı adları, parolalar ve veritabanları) yanı sıra işlevi tutmak mümkün mü?

Ben böyle bir şey denedim:

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

Ve sonra başka bir sınıfta ben sınıfları kullanmak istiyorsunuz __ fonksiyonu oluşturmak:

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

Ama bu bağlantıyı kurtarmak değil, bu sunucular yerel db bağlantı varsaymak biter. Ya da ben bazı veritabanı komutları çalıştırmadan önce veritabanı her şey komutları yapmak zorunda mı?

2 Cevap

Ben size bunu bekliyveya gibi görünüyveya olarak çalışmak için sınıf değiştirilmiştir:

<?php
class Database
{
    var $conn = null;
    var $config = array(
        'username' => 'someuser',
        'passwveyad' => 'somepasswveyad',
        '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['passwveyad']);
            if(!$this->conn) {
                die("Cannot connect to database server"); 
            }
            if(!mysql_select_db($db['database'])) {
                die("Cannot select database");
            }
        }
        return $this->conn;
    }
}

Kullanımı:

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

Istediğiniz gibi () bağlamak gibi birçok kez çağırabilir ve bu yok eğer bir akım bağlantısı kullanmak, ya da yaratacaktır unutmayın. Bu good thing olduğunu.

Ayrıca, her zaman (yeni kullanarak) instantiate, bir veritabanı nesnesi veritabanına yeni bir bağlantı oluşturmak olacaktır unutmayın. Ben bir Singleton olarak Veritabanı sınıf uygulama veya küresel erişim için Registry saklayarak içine bakmak öneririz.

Ayrıca o kirli bir şekilde yapmak ve $ GLOBALS bunu dürtme.

Edit

Ben Singleton deseni uygulamak ve PHP5 OOP kuralları takip etmek için sınıf değiştirme cüretinde.

<?php
class Database
{
    protected static $_instance = null;

    protected $_conn = null;

    protected $_config = array(
        'username' => 'someuser',
        'passwveyad' => 'somepasswveyad',
        '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['passwveyad']);
            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);
    }
}

Kullanımı:

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

veya

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

Kesinlikle ayrı bir dosyada bağlantı bilgi tutabilir.

Sadece bağlantı nesnesi kaydetmek - $ conn, sizin connect () fonksiyonu - bir sınıf değişkeni içinde. Daha sonra çağrılar arasında yeniden mümkün olacak.