veritabanı sorgu php ile sınıf nesneden bulunuyor

5 Cevap php

Benim soru:

Ben hala bu gibi bir nesne içindeki sorgu bulunuyor yapabilirsiniz:

$result = mysql_query ($q,$dbc) 
          or 
          trigger_error("Query: $q\n<br />MySQL Fout: " . mysql_error($dbc));

passing the global dbconnection değişken $dbc tarafından kurucusuna

veya daha iyi bir yolu var mı?

Or creating a singleton class for the databaseconnection, but I see a lot off negativity that people are writing about it.

I am new to making objects, so I don't know if I mayby have to do it all a little different, with the db I mean.

teşekkürler, Richard

5 Cevap

Eğer veritabanı soyutlama arıyorsanız, neden Zend Framework tarafından sağlanan DB sınıfları kullanarak düşünmüyoruz.

Onlar da işlemleri gerçekleştirmek için bir çırpıda, varsayılan olarak bir adaptör ayarlamak için bir yol bulunmalıdır.

Ekle o Parametrelenmiş sorguları yerine eski moda kote olanları kullanarak Zend_Db varsayılan, böylece güvenlik ve huzuru ekleyerek gerçeği.

küresellerle kullanarak oldukça çok kötü bir fikir, yanlışlıkla birini üzerine yazmak onun çok kolay! Eğer hızlı bir google ile bunları kullanarak değil bulmak tüm diğer nedenlerle birlikte.

Zend Framework ile bir db bağlantısı yaparak bir çırpıda,

$db = Zend_Db::factory('Pdo_Mysql', array(
'host'     => '127.0.0.1',
'username' => 'webuser',
'password' => 'xxxxxxxx',
'dbname'   => 'test'

));

Gerçekten bu kadar basit. Eğer sonra tablo sınıfları tek tek tabloların hızlı erişim sağlamak için yapmak, ya da daha gelişmiş katıldı querys için seçme ve deyim nesneleri kullanabilir ya.

Ayrıca, Zend Framework ile, eğer isterseniz sadece sadece DB bileşenleri kullanabilir, bütün yığını kullanmak zorunda değilsiniz.

Bunun için Zend Framework kullanmak istemiyorsanız, ben kesinlikle kendi DB soyutlama üzerine yazmaktan böyle Doktrini gibi bir ORM gibi alternatifleri düşünün öneriyoruz. Eğer çok hızlı bir canavar ile sona erecek ve bir ORM veya Zend Framework hataları Ezici pek çok geliştirici var, ve hatta daha fazlası vardır herhangi bir rapor.

Evet, böyle etrafında veritabanı bağlantısı iletebilirsiniz.

IMHO daha kolay biraz zor kodlama ama bir sürü test yapar.

İşte bunu kullanmak nasıl:

class DB {
    private $dbc;

    public function __construct($dbConn) {
        $this->dbc = $dbConn;
    }

    public function runQuery() {
        mysql_query($query, $this->dbc);
    }
}

Değişken geçmek. Singletons bir nedenle kötü bir üne sahip - onlar çok özel bir sorunu çözmek için icat edildi, ve hatta özellikle de yapmadım. Etrafında geçen değişkenler önlemek için bir yol olarak kullanmak etmeyin, o nasıl yapılması gerektiğini bulunuyor.

Ben bu amaç için bir tek sınıf kullanabilirsiniz, ama ben yine de globalleri aracılığıyla benim sınıf değişkeni etrafında geçmektedir.

Singleton sınıf ilk etapta oluşturulan nedeni emin bir sınıfın sadece bir örneği yaratılmış olduğunu yapmak oldu. Bu durumda, eminim veritabanına yalnızca bir örnek yaratılmış olduğunu yapmak istiyorum. Bir tek sınıf olarak sınıfını koyarak, bu sınıf ile arayüzleri kod yazıyor herkes aynı bağlantı alırsınız. Ama yine de değişken Küreselleşen için bir yedek değil.

Singleton sınıf için, burada bir örnek:

 class datbasebase
   {
    static $class = false;
    static function get_connection()
    {
    	if(self::$class == false)
    	{
    		self::$class = new database;
    	}
    	else
    	{
    		return self::$class;
    	}
    }
    // This will ensure it cannot be created again.
    protected function __construct()
    {
                $this->connection = mysql_connect();
    }
        public function query($query)
        {
                return mysql_query($query, $this->connection;
        }
   }

   $object = database::get_connection();

Ben defalarca kodu tekrarlamak istemiyorum çünkü ben bunu yerine sadece bağlantı etrafında geçen bu şekilde yapmak başlıca nedeni tamamen olduğunu. Bu yüzden, benim sorgu var bağlamak ve aynı sınıftaki diğer çeşitli DB işlevleri için bir zaman tasarrufu.