2012-03-15 26 views
7

Jestem całkiem nowy dla PDO, a także OOP z PHP w ogóle, więc proszę bądź miły :) Zasadniczo próbuję utworzyć obiekt połączenia na podstawie PDO, dzięki czemu mogę mieć jedno połączenie, które wywołuję w całej mojej witrynie.Najlepszy sposób tworzenia klasy połączenia statycznego mysql PDO?

Potrzebuję gotowych instrukcji, które po prostu sprawdzają różne wyniki w oparciu o identyfikator, który przechodzę, używając tego samego obiektu db, który próbuję utworzyć poniżej.

Jak utworzyć i uzyskać dostęp do klasy db, którą ustawiłem poniżej, a następnie użyć w niej funkcji, aby wyodrębnić odpowiednie informacje, których potrzebuję? Wszelkie przykłady byłyby świetne, dzięki czemu mogę zapoznać się z najlepszymi praktykami itp.

Bardzo dziękuję z góry.

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

pseudo-zmiennej $ nie jest dostępne w statycznych metodach i dla właściwości statycznych. Powinieneś użyć własności self :: $. W przeciwnym razie powie ona właściwość db :: property not defined – jscripter

+0

@BubuDaba son't edytować nieprawidłowy kod w pytaniu, ponieważ może to uczynić inne asnwersje nieistotne. Jeśli masz sugestię dotyczącą PO, napisz odpowiedź lub komentarz. –

Odpowiedz

5

Można zacząć od nie zawsze używając Singleton ponownie. To (i klasy statyczne w ogóle) jest złe z tych samych powodów, dla których zmienne globalne w programowaniu proceduralnym są złe.

To powiedziawszy ... Zamiast próbować egzekwować wyjątkowość obiektu połączenia, powinieneś po prostu upewnić się, że używasz tego samego połączenia w każdym miejscu.

Oto przykład tego, co mam na myśli, że:

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

W tym momencie oba $foo i $bar obiekty będą miały dostęp do samo przykład PDO. Jeśli masz obiekt, który potrzebuje dostępu do bazy danych, po prostu podaj mu połączenie w konstruktorze.

Istnieją dwa filmy, które warto obejrzeć (slajdy będą zawierać kod Java, ale nie powinno być troble zrozumienie IT):

+0

Dlaczego mówisz, że klasy statyczne są w ogóle złe - używam klasy statycznej do własnego opakowania PDO ... Wydaje mi się, że dobrze mi idzie. Czy jest jakiś szczególny powód, dla którego powinniśmy ich unikać? – BenOfTheNorth

+0

@BenGriffiths, kilka powodów. Głównym problemem jest to, że przy * statycznych klasach * nie można używać polimorfizmu. Wykonywanie metod jest powiązane z ** nazwą ** klasy. Również to nie jest naprawdę OOP. Klasa statyczna jest tam tylko dla pokazu. To, co masz, to lista funkcji związanych w strukturze przestrzeni nazw.W każdym razie powinieneś po prostu zbadać ten temat. Istnieje wiele materiałów. [Możesz zacząć tutaj] (http://kore-nordmann.de/blog/0103_static_considered_harmful.html), jeśli chcesz poznać lepsze praktyki. –

+0

dzięki, zajrzę do tego. Moim osobistym powodem używania statycznego jest to, że nie muszę zadeklarować klasy w całym miejscu, czy też muszę przekazywać ją innym obiektom - Jest to użyteczne jako rodzaj stałego obiektu. Nie potrzebuję dużej klasy w moim własnym przypadku, ale posiadanie jej w małej klasie statycznej sprawia, że ​​jest ona łatwiejsza w zarządzaniu. – BenOfTheNorth

0

Stałe połączenia są wbudowane w:

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

Zobacz Example #4 Persistent connections

+0

Jest to użyteczne, nawet jeśli nie zapewnia odpowiedzi na oryginalne pytanie, może powinno zostać opublikowane jako komentarz ... '/ * A może dlatego, że twoje */class Odpowiedź rozszerza LogicException {}; spróbuj {$ to = include ('some/more.php'); '' i $ re = new Answer(); if ("chcesz" == $ to);} catch (Points $ for) {new Odpowiedź () lub umrzeć ($ for.this ');} ' –

+2

Masz tutaj komika. –