Nasıl php veritabanı bağlantıları yönetirim?

3 Cevap php

Bu yüzden son zamanlarda gerçekten aktif php kullanmaya başladım, ve ben veritabanı bağlantıları kullanmak için farklı yollar üzerinde bazı anlayışlar gerekir.

İlk başta sadece basit mysql_connect kullanılan ():

<?php
    $connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
    mysql_select_db(DB_DB, $connection);
?>

Bir süre sonra ben dahil ve her dosya başlatmak için başlatılan bir veritabanı sınıfı yarattı - böyle bir şey:

<?php
class MySQL_DB {

var $connection;

function MySQL_DB(){
	$this->connection = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
	mysql_select_db(DB_DB, $this->connection);
}

function query($q){
	$res = mysql_query($q, $this->connection) or die(mysql_error());
	return $res;
}
}

$database = New MySQL_DB;
?>

Ve bu vea kullanıyorum ne - ve iyi çalışıyor - ama geliştirmek için yollar her zaman vardır.

Yani benim size sorum nasıl veritabanı bağlantıları yönetmek yapmak nedir?

  • Eğer sınıfları kullanıyor musunuz?
  • What does your classes contain (just the connection or even functions?)
  • Ne uygulamalar tavsiye edersiniz?

3 Cevap

Sınıfların kullanımı özelleştirilmiş yeniden kullanılabilirliğini artırmak gitmek için yoludur.

Sınıfa tüm jenerik uygulamaları getirmek. Sen doğru yolda.

This website has the following clean approach .

class connection {
    // Possible Modules are as follows:
    // DBX_MYSQL, DBX_ODBC, DBX_PGSQL, DBX_MSSQL, DBX_FBSQL, DBX_SYBASECT, DBX_OCI8, DBX_SQLITE
    private $module = DBX_MYSQL; 

    private $host = "localhost";
    private $database = "test";
    private $username = "testuser";
    private $password = "testpass";

    private $link;
    private $result;
    public $sql;

    function __construct($database=""){
            if (!empty($database)){ $this->database = $database; }
            $this->link = dbx_connect($this->module,$this->host,$this->database,$this->username,$this->password);
            return $this->link;  // returns false if connection could not be made.
    }

    function query($sql){
            if (!empty($sql)){
                    $this->sql = $sql;
                    $this->result = dbx_query($this->link,$sql,DBX_RESULT_UNBUFFERED);
                    return $this->result;
            }else{
                    return false;
            }
    }

    function fetch($result=""){
            if (empty($result)){ $result = $this->result; }
            return dbx_fetch_row($result);
    }

    function __destruct(){
            dbx_close($this->link);
    }
}

Geçerli yaklaşım oldukça standart ve iyi çalışıyor. Ben uzun bir süre için kullanılır. Bu da çok güzel ve ev demlemek koduyla sorunlardan uzak alabilirsiniz, hangi PDO'de gibi modüller artık bu gibi baz işlevselliği sağlamak doğrudur.

Ancak, ben bir adım daha ileri bağlantı yönetimini aldım. Karmaşık bir uygulama içine alırsanız, size birden fazla veritabanı, ya da ağır veritabanı kullanımı var bir durum içine alabilirsiniz. Tek bir veritabanı bağlantısı dosyası da dahil olmak üzere küresel bir $database değişken çoklu veritabanları için ağır olur, ve might not need, bir veritabanı bağlantısı uygulama istekleri için gereksiz sahip. Veritabanına bağlanırken pahalı olduğunu unutmayın.

Ne yaptık, benim için veritabanı nesnesini işleyen bir tek DatabaseManager sınıf oluşturmak ve belirli bir DB emin birden fazla bağlantı örneği alamadım yapar. Bunun yerine app üstünde yeni bir veritabanı nesnesi başlatılırken, sadece DatabaseManager üzerinde nesneyi gerekir her zaman diyoruz.

$db = DatabaseManager::getDatabase();

Burada bir CodeIgniter proje için çırpılmış bir örnek sınıf bulunuyor. Eğer CI kullanarak olmasaydı sadece kendi sınıf için yerine (ve bunun için bağlantı rutin çalıştırın) olacağını CodeIgniter'ın varsayılan veritabanı nesnesini yükler getDatabase() fonksiyonu görebilirsiniz. Bu oldukça basit bir yönetim sınıfı ve oldukça kolay farklı veritabanları için birden çok bağlantı yönetmek için uzun olabilir.

<?php

/**
 * Implements the Singleton pattern to prevent multiple instantiations and connections
 * to the application database.
 *
 */
class Database_manager
{
    private static $instance;
    public $db;

    /**
     * Constructor function is declared private to prevent instantiation.
     *
     */
    protected function __construct()
    {
    	parent::__construct();
    }

    /**
     * Returns an instance of a Database_manager.
     *
     * @return object Database_manager object
     */
    public static function getInstance()
    {
    	if (self::$instance == null) {
    		$className = __CLASS__;
    		self::$instance = new $className();
    	}
    	return self::$instance;
    }

    public static function getDatabase()
    {
    	$instance = self::getInstance();
    	if ($instance->db == null) {
    		//utilize CodeIgniter's database loader
    		$instance->db = $instance->load->database('',true);
    		if (! is_object($instance->db)) throw new Exception("Could not load database.");
    	}
    	return $instance->db;
    }
}

Ben veritabanı bakım için bir uygulama aşağı çekmek zorunda Belki bağlantısı yönetimi bu tarzı kullanarak çıkmak en yaygın avantajdır. Ben kadar ihtiyacımız bir veritabanı bağlantısı başlatmasını tarafından değil, ben kolayca bir sitede mesajın bir "ilerleme içinde bakım" (kısa devre, normal MVC sevk) kadar koyabilirsiniz, ve bakım iken bir DB bağlantısı açmaya uygulama istekleri dert ilerleme.

In your database manager example, you did not define a parent for your class. Therefore, invoking parent::__constructor() yields an exception, and also, you cannot use the load property of code ignitor.

Eğer DatabaseManager için bir uzantısı olarak hangi sınıf kullandınız?

Since i do not know where you placed your databasemanager code, nor which class you used as its parent, i circumvented the exceptions by making the getDatabase() method receive an input parameter which i called $loader. Normally, this $loader object will be the model class requiring access to a database.

public static function getDatabase($loader)   
{  
    $instance = self::getInstance();  
    if ($instance->db == null) {  
            //utilize CodeIgniter's database loader  
            $instance->db = $loader->load->database('default',true);  
            if (! is_object($instance->db)) throw new Exception("Could not load database.");  
    }  
    return $instance->db;  
}  

Saygılarımızla.