Fifi209, a nagle zachodzi potrzeba użycia dwóch połączeń do bazy danych - bo jedna zawiera ogromne ilości danych roboczych, a w drugiej są już te dane przetworzone. Jak byś zrobił taką przetwarzarkę, kiedy połączenie z baża danych było tylko jedno? Singleton to antywzorzec, w 99.99% przypadków NIE JEST potrzebny.
Co do autora, kod obiektowy to to nie jest, tylko opakowany w klasy. Connection, to mogłaby być zmienna przechowująca uchwyt do bazy, funkcja to connect() lub disconnect(). Disconnection nie może istnieć, bo jest niepoprawne gramatycznie. Ktoś dobrze napisał, żeby zrobić to w metodach __construct() i __destruct(). Nie rozumiem stosowania pól statycznych, jak już robisz typową klasę uczących się programowania obiektowego, czyli sterownik do bazy danych, fajnie byłoby gdyby sterownik do bazy danych komunikował się z managerem baz danych. Raz stosujesz mojaFunkcja() a raz moja_funkcja() - zdecyduj się na jedno nazewnictwo, bo potem obudzisz się z ręką w nocniku jak przyjdzie więcej kodu.
Skrobnąłem Ci przykładowy kod, w którym możesz zobaczyć zarys projektowy (?) przykładowej klasy do obsługi bazy danych. Pisałem z palca i nie testowałem, więc może są jakieś drobne błędy, które sobie poprawisz. Już teraz widzę, że rozszyfrowywaniem $dsn powinien się zajmować DatabaseManager, drivery powinny być przechowywane w tablicy DatabaseManeger::$drivers jako np. 'mysql'=>$mysqlDriver, a DatabaseManager powinien sprawdzać czy istnieje tam system bazodanowy z dsn i na podstawie tego wybrać sterownik lub zwrócić wyjątek, że nie znaleziono pasującego sterownika. To także zostawiam dla Ciebie

<?php
interface DatabaseDriver
{
public function __construct($dsn);
public function __destruct();
public function executeQuery($query);
public function getNumberOfRows($result);
public function getOneRow($result);
// public function getAllRows($result); // to potem można zaimplementować, mi się nie chciało już
}
class DatabaseDriver_MySQL implements DatabaseDriver
{
protected $resource;
public function __construct($dsn)
{
// jakoś rozbijamy $dsn na $hostname, $username, $password, $databasename
$this->resource = mysql_connect($hostname, $username, $password); if(!$this->resource)
throw new Exception("Coś poszło źle!");
throw new Exception("Baza danych '$databasename' nie istnieje!");
}
public function __destruct()
{
}
public function executeQuery($query)
{
if(!$result)
throw new Exception("Houston, mamy problem!");
return $result;
}
public function getNumberOfRows($result)
{
return mysql_num_rows($result); //tu mozna jakas walidacje dorobic jeszcze }
public function getOneRow($result)
{
}
}
class DatabaseDriver_PostgreSQL implements DatabaseDriver
{
protected $resource;
public function __construct($dsn)
{
// jakoś rozbijamy $dsn na $hostname, $username, $password, $databasename
$this->resource = pg_connect("host=$hostname dbname=$databasename user=$username password=$password"); if(!$this->resource)
throw new Exception("Coś poszło źle!");
}
public function __destruct()
{
}
public function executeQuery($query)
{
if(!$result)
throw new Exception("Houston, mamy problem!");
return $result;
}
public function getNumberOfRows($result)
{
return pg_num_rows($result); //tu mozna jakas walidacje dorobic jeszcze }
public function getOneRow($result)
{
}
}
class DatabaseManager
{
protected $driver;
public function attachDriver(DatabaseDriver $driver)
{
$this->driver = $driver;
}
public function __call($methodName, $arguments)
{
return call_user_func_array
(array($this->driver, $methodName), $arguments); }
}
$dm = new DatabaseManager;
$dd = new DatabaseDriver_PostgreSQL("pgsql:host=myhost;dbname=mydatabasename;user=myuser;password=mypass");
$dm->attachDriver($dd);
$result = $dm->executeQuery("SELECT * FROM tabela");
if($dm->getNumberOfRows($result)>0)
{
while($row = $dm->getOneRow($result))
{
// wyswietlasz dane ;)
}
}