2012-03-15 20 views
7

Genel olarak PHP ile birlikte PDO ve OOP için oldukça yeniyim, lütfen güzel olunuz :) Temelde PDO'ya dayanan bir bağlantı nesnesi yapmaya çalışıyorum, böylece sitem boyunca aradığım tek bir bağlantım olabilir.PDO mysql statik bağlantı sınıfını oluşturmanın en iyi yolu?

Aşağıda oluşturmaya çalıştığım aynı db nesnesini kullanarak geçirdiğim bir kimliğe dayalı olarak farklı sonuçlar aramak için hazırlanmış bazı ifadelere ihtiyacım var.

Aşağıda ayarladığım db sınıfına nasıl erişirim ve erişirim ve sonra ihtiyacım olan ilgili bilgileri ayıklamak için içindeki işlevleri kullanırım? Herhangi bir örnek harika olurdu, böylece en iyi uygulamalar hakkında fikir edinebilirim.

Çok teşekkürler şimdiden.

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
    PDO::ATTR_PERSISTENT => true 
)); 

Bir daha Singleton deseni kullanmayarak başlayabilir Example #4 Persistent connections

+0

$ this, statik yöntemler ve statik özellikler için mevcut değildir. Self :: $ özelliğini kullanmalısınız. Aksi takdirde db :: özellik tanimlanmamis oldugunu düsünecek – jscripter

+0

@BubuDaba diger asnwers ilgisiz hale getirebilecegi gibi dogru kodu düzenlemez. OP için bir öneriniz varsa, bir cevap veya yorum yazınız –

cevap

5

bakınız:

class db { 

    private static $connection; 

    private function __construct(){} 
    private function __clone(){} 

    private static function connect($db_server="localhost", $db_user="user", $db_pass="password") { 
     if(!$this->connection){ 
      try{ 
       $this->connection = new PDO($db_server, $db_user, $db_pass); 
      } catch (PDOException $e) { 
       $this->connection = null; 
       die($e->getMessage()); 
      } 
     } 
     return $this->connection; 
    } 

} 

$dbh = new db::connect(); 

$stmt = $dbh->prepare("SELECT * FROM questions where id = ?"); 
if($stmt->execute(array($_REQUEST['testid']))) { 
    while ($row = $stmt->fetch()) { 
    print_r($row); 
    } 
} 
+0

Neden statik sınıfların genel olarak kötü olduğunu söylüyorsunuz - Kendi PDO sarıcam için statik bir sınıf kullanıyorum ... Benim için iyi çalışıyor gibi görünüyor. Onlardan kaçınmamızın belli bir nedeni var mı? – BenOfTheNorth

+0

@BenGriffiths, çeşitli nedenlerden dolayı. Esas problem * statik sınıflarla * polimorfizmi kullanamazsınız. Yöntemlerin uygulanması, sınıfın ** adı ** ile bağlanır. Ayrıca bu gerçekten OOP değil. Statik sınıf aslında sadece bir gösteri için var. Sahip olduğunuz işlevler, bir namespace-ish yapısına bağlı olan listedir.Her neyse, sadece konuyu araştırmalısın. Çok fazla malzeme var. Bazı daha iyi uygulamaları öğrenmek istiyorsanız, buradan başlayabilirsiniz (http://kore-nordmann.de/blog/0103_static_considered_harmful.html). –

+0

teşekkürler, ona bakacağım. Statik kullanmak için benim kişisel nedenim, çünkü her yerde sınıfı bildirmek zorunda kalmam ya da başka nesnelere aktarmaya devam etmem gerekiyor - Bir çeşit sabit nesne olarak faydalıdır. Kendi durumumda büyük bir sınıfa ihtiyacım yok, fakat küçük bir statik sınıfa sarılmış olması onu daha düzenli ve daha kolay yönetiyor. – BenOfTheNorth

0

Kalıcı bağlantıları inşa edilmiştir. Bu (ve genel olarak statik sınıflar), prosedürel programlamadaki global değişkenlerin neden kötü olmasının tüm nedenleri için kötüdür.

Dedi ... Bağlantı nesnesinin benzersizliğini zorlamaya çalışmak yerine, aynı bağlantıyı her yerde kullandığınızdan emin olmalısınız. Her iki $foo ve $bar nesneler aynı PDO örneğine erişebilir Bu noktada

class Foo 
{ 
    protected $connection = null; 
    public function __construct(PDO $connection) 
    { 
     $this->connection = $connection; 
    } 
} 

class Bar 
{ 
    // all the same as in Foo 
} 

$connection = new PDO('sqlite::memory'); 

$foo = new Foo($connection); 
$bar = new Bar($connection); 

:

İşte ben o ile ne demek bir örnek. Veritabanına erişmesi gereken bir nesneye sahipseniz, yalnızca kurucuda bir bağlantı sağlayın.

izlemek isteyebilirsiniz iki video var (slaytlar Java kod içerir, ancak hiçbir troble anlayışa sahip olması gereken): sözde değişken

+0

Bu, orijinal soruya cevap vermese de yararlı olabilir, belki de yorum olarak gönderilmelidir ... '/ * Veya belki de sizin */sınıf Cevap LogicException {}; {$ to = include ('biraz/daha fazla .php'); '' ve $ re = yeni Cevap(); if ('== $' dan);} yakalamak ($ ​​için puan) {Yeni Cevap () veya ölün ($ for.'this ');} –

+2

Burada bir komedyen var. –