Autor Zpráva
jansfabik
Profil
zdravím, potřebuji poradit s implementací multi-databázové podpory v PHP

mám přibližně takovouto myšlenku:
v systému bude pro každý databázový systém vytvořena zvláštní knihovna, bude v ní třída pro práci s databází, všechny metody budou totožné, jenom bude vždycky jiný SQL dotaz, při připojování k databázi se pomocí switche zvolí správná knihovna

bude se pracovat s databází MySQL, MySQLi, Oracle, PgSQL a SQLite

tady je předběžná ukázka:
class DB
{
    // přístupové údaje
    private static $host;
    private static $port;
    private static $user;
    private static $password;
    private static $database;
    private static $prefix;

    // link (vrací ho funkce connect)
    private static $link;

    // připojení a odpojení k databázi (voláno přes konstruktor a destruktor)
    private static function connect ()
    private static function disconnect ()

    // dotazy pro práci s daty
    public static function qSelect ($table, $vars, $where, $limit, $offset)
    public static function qInsert ($table, $vars)
    public static function qUpdate ($table, $vars, $where, $limit, $offset)
    public static function qDelete ($table, $where, $limit, $offset)

    // práce s tabulkami
    public static function qCreateTable ($name, $columns)
    public static function qDropTable ($name)
    public static function qCreateIndex ($table, $name, $columns)
    public static function qDeleteIndex ($table, $name)

    // dotaz - vrátí DBQ
    public static function query ($query)

}

class DBQ
{
    private static $query       // dotaz
    private static $result      // výsledek
    private static execute ()   // provede dotaz - voláno přes konstruktor
    public static fetchArray () // vrátí pole s aktuálním řádkem
    public static fetchAll ()   // vrátí všechny řádky v jednom poli
    public static numRows ()    // vrátí počet řádků
}


tady je příklad použití v praxi - jedná se o přihlašovací skript:
$query = DB::qSelect ('users', '*', array('name="'.escape($name).'"', 'pass="'.sha1($pass).'"'), 1);
if ($user->numRows ()) {
    $user = $query->fetchArray ();
    DB::qInsert ('authorization', array('user' => $user['id'], 'session' => session_id(), 'expire' => time()+86400));
    echo 'Jste úspěšně přihlášený!';
} else {
    echo 'Chyba v přihlášení!';
}


chci poradit co by chtělo vylepšit a co tam chybí
BetaCam
Profil
jansfabik
chci poradit co by chtělo vylepšit a co tam chybí

Poradím ti nauč se něco o OOP a když né o OOP tak o rozhraní určitě. To co si tu napsal je jedna sekera za druhou a naprosté nepochopení rozhraní.

1) Rozhraní nesmí obsahovat členské proměnné.

    // přístupové údaje
    private static $host;
    private static $port;
    private static $user;
    private static $password;
    private static $database;
    private static $prefix;

    // link (vrací ho funkce connect)
    private static $link;


toto bude tedy v rozhraní DB tak maximálně k vyhození FATAL ERRORu. Stejně tak i v ostatních rozhraních.

2) Rozhraní už ze své podstaty může obsahovat pouze public metody.
    private static function connect ();
    private static function disconnect ();


Toto je tedy opět naprostý nesmysl a jediná funkce tohoto zápisu bude zas FATAL ERROR.


Tato tvá „předběžná ukázka“ ukázala, že si opravdu naprosto nepochopil "smysl" a "funkci" rozhraní.
jansfabik
Profil
BetaCam
1) Rozhraní nesmí obsahovat členské proměnné.
změnil jsem rozhraní rovnou na třídu, aby to nějak nepletlo. jinak mě jde hlavně o to, aby jiné skripty nepřepsaly přístupové údaje a nemohly je číst, a proto jsem to dal všechno do jedné třídy a nastavil všemu private static - přístup k nim pak budou mít jenom metody třídy DB

Rozhraní už ze své podstaty může obsahovat pouze public metody
metody connect a disconnect se budou volat jenom přes konstruktor a destruktor, a to proto, aby cizí skripty nezpůsobily za chodu aplikace ukončení spojení
BetaCam
Profil
jansfabik
změnil jsem rozhraní rovnou na třídu, aby to nějak nepletlo.

No takhle už to vypadá aspoň funkčně. :) Když sem viděl původní zápis kde si to měl označené jako rozhraní tak se mi naježily všechny chlupy na těle. :)
srigi
Profil
Preco vymyslat vymyslene? idea1, idea2.
BetaCam
Profil
srigi
Preco vymyslat vymyslene?

To už se tu rozebíralo mnohokrát. Například proto, že spousta DB layerů je příliš megalomanská či ti nesedí způsob jejich používání.

Ale třeba tebou zde zmiňované DIBI mi přijde jako dobrý layer. Žádné zbytečné kraviny, které člověk použije jednou za uherák. Sám DIBI poslední dobou docela často používám.
jansfabik
Profil
zend framework jsem zkoušel, ale připadalo mi to moc pomalé, ale to dibi vypadá zajímavě, asi to vyzkouším
srigi
Profil
Mno Zend je dost modularny, v pohode sa da z neho Zen_Db komponent vytiahnut. Akurat s tym experimentujem.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: