Autor | Zpráva | ||
---|---|---|---|
Fisak Profil |
#1 · Zasláno: 2. 3. 2012, 14:28:23 · Upravil/a: Fisak
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 |
#2 · Zasláno: 2. 3. 2012, 15:11:58
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 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 |
#3 · Zasláno: 2. 3. 2012, 15:17:56
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 |
#4 · Zasláno: 2. 3. 2012, 15:23:50
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 |
#5 · Zasláno: 2. 3. 2012, 15:33:06
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 |
#6 · Zasláno: 2. 3. 2012, 15:34:59 · Upravil/a: Fisak
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... |
||
Časová prodleva: 12 let
|
0