Post
#1
|
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 1 Dołączył: 6.12.2007 Ostrzeżenie: (0%)
|
Napisalem abstrakycjna klase do obslugi bazy mysql
Co o niej sadzicie? Chce na niej bazowac w duzym projekcie i nie chcialbym wtopic Jak robic cachowanie? Nie mam pomyslu...
Ten post edytował Beynar 11.12.2007, 22:59:41 |
|
|
|
![]() |
Post
#2
|
|
|
Grupa: Zarejestrowani Postów: 2 262 Pomógł: 21 Dołączył: 3.05.2004 Skąd: Sopot, Krakow, W-wa Ostrzeżenie: (0%)
|
Daj sobie na luz i uzyj PDO.
|
|
|
|
Post
#3
|
|
|
Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%)
|
Właściwości powinny być private, używaj metod dostępowych gdzie trzeba. Łączenie z baza to zadanie dla konstruktora (zamykanie polaczenia dla destruktora). Metoda numRows jest zupelnie niepotrzebna, można użyć count() bezpośrednio w kodzie. Sama klasa powinna być Singletonem (albo częścią rejestru). Żadna metoda klasy nie powinna (mam tu na myśli error()) wysyłać nic bezpośrednio na wyjście (echo). Funkcje bazy takie jak INSERT czy UPDATE powinny być zaimplementowane osobno, a nie razem z SELECT bo nie zwracają przecież tablicy wyników! Sama warstwa abstrakcji powinna korzystać ze sterownika bazy danych (osobna klasa) i na podstawie parametrów wybierać odpowiedni (np MYSQL) - wzorzec STRATEGY, FACTORY...
Nazywanie publicznych właściwości od _ jest mylące, ale o w sumie Twoja sprawa. Poza tym i tak dalej w kodzie używasz czystego SQLa. Odczyteywanie _last_id z właściwości klasy jest błędem bo jeśli inny User doda coś do bazy na innej sesji to otrzymujesz błędny wynik! Nie do zmiany bazy danych musisz tworzyć nową instancje! Brak jakichkolwiek zabezpieczeń... Już mi się nie chce dalej, a troche jeszcze tego jest (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) Co do cachowania to dość rozległy temat. PS to chyba nie jest abstrakcyjna klasa (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif) Ten post edytował ayeo 12.12.2007, 00:38:13 |
|
|
|
Post
#4
|
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 1 Dołączył: 6.12.2007 Ostrzeżenie: (0%)
|
@ayeo ->
"Właściwości powinny być private, używaj metod dostępowych gdzie trzeba." - OK, przerobie to ale co to daje? "Łączenie z baza to zadanie dla konstruktora (zamykanie polaczenia dla destruktora)." - tak zrobilem na poczatku ale problemy zaczely sie pojawiac gdy od-serializowywuje. Jak wtedy moge podac argumenty dla konstruktora do polaczenia? "Sama klasa powinna być Singletonem (albo częścią rejestru)." - Czytalem o singletoenie itd... ale dalej nie wiem jak moge to zaimplementowac w prkatyce? "Żadna metoda klasy nie powinna (mam tu na myśli error()) wysyłać nic bezpośrednio na wyjście (echo)." zgadzam się, takie rozwiaznie jest tylko na czas rozwijania aplikacji, ulatwi nam debugowanie. Pozniej ta linijke zamienie na zapis do logow. "Sama warstwa abstrakcji powinna korzystać ze sterownika bazy danych (osobna klasa) i na podstawie parametrów wybierać odpowiedni (np MYSQL)" - zatem pomyliłem chyba pojecia- nie jest to warstwa abstrakcyjna w takim razie. Nastawiamy sie tylko na mysql, tyle ze ta klasa bedzie bazowa i uniwersalna, i w razie zmiany bazy (co jest jednak bardzo mało prawdopodobne) bedzie mniej problemow. "Nazywanie publicznych właściwości od _ jest mylące, ale o w sumie Twoja sprawa." - prefix _ ma zapewnic unikalnosc, gdyz zamierzam w wyzszych warstwach aplikacji korzystajacaych z bazy dziedziczyac ta funkcje i nie chce miec problemow jesli ktos nada potomnej klasie wlasciwosc o tej samej nazwie "Poza tym i tak dalej w kodzie używasz czystego SQLa." - zatem robic takie funkcje jak insertData($table, $data), deleteRecord($primary_id_name, $id)? I tak nie unikne wpisywania skladni SQL w skryptach bo niektore zapytania beda zbyt zawile zeby to skracac przez wyprowadzenie zmiennych w metodzie. Dzieki za rady. Pozdrawiam Ten post edytował Beynar 12.12.2007, 19:33:33 |
|
|
|
Post
#5
|
|
|
Grupa: Przyjaciele php.pl Postów: 1 202 Pomógł: 117 Dołączył: 13.04.2007 Skąd: 127.0.0.1 Ostrzeżenie: (0%)
|
Cytat "Nazywanie publicznych właściwości od _ jest mylące, ale o w sumie Twoja sprawa." - prefix _ ma zapewnic unikalnosc, gdyz zamierzam w wyzszych warstwach aplikacji korzystajacaych z bazy dziedziczyac ta funkcje i nie chce miec problemow jesli ktos nada potomnej klasie wlasciwosc o tej samej nazwie Właściwości prywatne nie podlegają dziedziczeniu... poza tym co ma dziedziczyć po klasie bazy danych? (oprócz sterownika ewentualnie) Cytat "Łączenie z baza to zadanie dla konstruktora (zamykanie polaczenia dla destruktora)." - tak zrobilem na poczatku ale problemy zaczely sie pojawiac gdy od-serializowywuje. Jak wtedy moge podac argumenty dla konstruktora do polaczenia? Po co serializować obiekt bazy? Jeśli zrobisz sobie Singletona to masz gdzieś czy istnieje instancja czy nie. Jak nie będzie to się sama stworzy (dlatego powinieneś zapisać parametry połączenia na sztywno w klasie, a najlepiej w pliku config.ini). Jeśli chcesz już serializować na siłę powinieneś to załatwić metodami _sleep() i _wakeup(); Są one wywoływane przy serializowaniu i odserializowywaniu obiektu więc jedna metoda zamyka połączenie, a druga otwiera. Parametry $host, $user, $password, $port możesz przypisać do zmiennych prywatnych (nie ma potrzeby dostępu z zewnątrz to dych właściwości) klasy. Metoda _wakeup(); stamtąd sobie je weźnie i otworzy połączenie przy unserialize(); W każdym razie nie widzę potrzeby serializowania instancji klasy bazy danych! Co do metod (np INSERT) sprawa jest prosta. Jako parametr przekazujesz tablice poprostu (name => Kazik, login => Kazik82), możesz tu dodać jakąś translacje nazw, żeby zmiana w bazie nie pociągała konieczności grzebania w kodzie. Jako osobna klasa ProperyManager. Sprawa komplikuje się z SELECT (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Tutaj dochodzą różne opcje: JOIN, UNION, FOR UPDATE itd. Możesz to zrobić tak jak np w CodeIgniter. Żeby cokolwiek cachwać musisz wiedzieć co (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) musisz więc logować zapytania sql. W grę w sumie wchodzą tylko SELECTY, więc w metedzie select wywołujesz globalną (zdefiniowaną w głównym kodzie poza jakąkolwiek klasą) funkcję log_sql($sql). Sama funkcja log_sql(); powinna poprostu sprawdzać czy zapytanie zostało wcześniej zapisane i jeśli tak to podbija licznik, a jeśli nie to dodaje do bazy. Możesz też do metody select przekazywać dodatkowy parametr (flagę), takie zapytanie nie będzie logowane poprostu... A tak BTW klasa nie obsługuje transakcji, blokowania tabel ani rekordów. Zamiast tego ECHO i całej metody error zrób poprostu throw exception... Pozdrawiam! Ten post edytował ayeo 13.12.2007, 00:08:55 |
|
|
|
![]() ![]() |
|
Aktualny czas: 21.12.2025 - 18:25 |