Autor Zpráva
Fisak
Profil
Zdravím.. dělám si svůj db layer ale rád bych se vás zeptal co si myslíte že mi zde ještě chybí....
<?php
/* zde změň přístupy adresu atd... */
abstract class conf {
static protected $db_server = "localhost";
static protected $db_login = "root";
static protected $db_pass = "vertrigo";
static protected $db_name_system = "system";
static protected $db_name_users = "uzivatele";
static protected $db_name_content = "obsah";
}
<?php
abstract class database extends conf{

    static function connect($db_name) {

    if(!mysql_connect(self::$db_server,self::$db_login,self::$db_pass)){
    
        return mysql_error();

    } else {

        if(!mysql_select_db($db_name)){

             return "Nepodařilo se vybrat databázi $db_name.";
         
        } else {
    
            mysql_query("SET character_set_results = utf8");
            mysql_query("SET character_set_connection = utf8"); 
            mysql_query("SET NAMES utf8");
        
        } 
     
    }
      
    }

}
<?php
class db extends database {

//připojení k databázy system    
static function query_system($retezec)
{
    static $connected_sys = false; 
    if($connected_sys === false) db::connect(self::$db_name_system);  
    
    return mysql_query($retezec); 
}

//pripojení k databázy uživatelu
static function query_users($retezec)
{
    static $connected_us = false; 
    if($connected_us === false) db::connect(self::$db_name_users);
    
    return mysql_query($retezec); 
}

//pripojení k databázy obsahu
static function query_content($retezec)
{
    static $connected_cont = false; 
    if($connected_cont === false) db::connect(self::$db_name_content);
    
    return mysql_query($retezec); 
}

}



popř. jak by jste to ještě vylepšili zabezpečili apod.
Tori
Profil
Nějak se mi nelíbí mít pro každou databázi extra metodu (které jsou navíc až na jednu proměnnou totožné). Pokud potřebujete střídat přístup k různým DB, asi bych do nějaké soukromé proměnné uložila, k čemu jsem zrovna připojená, a v případě potřeby měnila. Metoda query by pak byla jen jedna:
// skript č.1 - několik db, musím povinně vybrat, kterou chci použít
db::query($sql, 'content'); // chci provést dotaz nad db v proměnné $db_name_content
db::query($sql2, 'users'); // chci jinou db - přepne se.
db::query($sql3, 'users'); // stejná db jako minule, nic neměním
db::query($sql4); // selže, není zvolená db

// skript č.2 - jedna preferovaná db
conf::default_db('content'); // vyberu databázi, která se automaticky použije všude, kde není požadována jiná.
// stejná metoda bez parametru vrací aktuální hodnotu.
db::query($sql5); 
db::query($sql6); // všude se používá db $db_name_content
db::query($sql7, 'users'); // jednorázově změním db
db::query($sql8); // opět se použije db content
Jsem zvědavá, jak budete dělat čtení/formátování dat z DB, nebo escapování.
Nevidím ale důvod, proč by měla třída database být potomkem v podstatě asoc.pole s nastaveními. Spíš bych jí předala to pole jako parametr, aspoň nebude závislá na zdroji těch nastavení (napevno ve skriptu, parsovaný .ini soubor, ...).
Fisak
Profil
Tori:
nevím já bych tedy preferoval radši si přehledně psát db::query_system("dotaz"); než-li db::query("dotaz", "db"); ale zdá se mi že tohle je špíše o tom jak se to komu lépe píše ... ale jako nápad je to dobrý jen jak říkam lepšíc se mi to píše db::query_system("dotaz");
Tori
Profil
Fisak:
já bych tedy preferoval radši si přehledně psát db::query_system("dotaz"); než-li db::query("dotaz", "db"); ale zdá se mi že tohle je špíše o tom jak se to komu lépe píše
Asi ano. Jsem si jen představila, že pokud budu chtít připojovat další db, musím si technikou Ctrl+C Ctrl+V přidat metodu. Ale pokud to je pro nějaký cms, napevno vázaný na konkrétní strukturu db, tak by mi to jako uživateli taky přišlo lepší.
Ugo
Profil
nechci říkat ať to kompletně změníš, ale přesně od tohoto existují instance :) problém je spíš v tom že když budeš chtít změnit metodu query tak musíš měnit několikrát zbytečně. I já to mám ale ve své vrstvě špatně takže pomlčím, ne vždy to jde inteligentně udělat (sqlite3 driver se chová např. jinak než mysql).

Udělal bych víc instancí, klidně je můžeš uchovávat ve statické třídě abys je měl globálně dostupné - container::getDb('system')->query('xxx');

Ohledně bezpečnosti je to úplně bez zabezpečení, jako db layer to taky není je to mysql layer a spíš než to, tak jednoúčelový modul bez možnosti použití jinde, neumím poradit jak to udělat lépe na to se musí přijít časem, ale takto to není ani zdaleka dobré.
Fisak
Profil
Tori:
jo jo je to pro můj vlastní cms .. a hlavně u tvého návrhu je jedna chyba.. když dáš jako první db::query("dotaz"); tak ještě není vybrána db tudíž nastane error ... ale u mého návrhu vždy musíš volit db .. ale zase máš dobrý nápad s tím děděním že pokud se jednou připojíš k určité databázy např. "users" tak další dotaz můžeš napsat bez toho ... to u mého návrhu vždy musíš psát do jaké db se chceš připojit


Ugo:
jj chápu ještě sem tam zabezpečení nedělal ... jsem teprve na začátku takže postupně se i k tomu dostanu...

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:

0