![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 420 Pomógł: 44 Dołączył: 22.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam mam mały problem mam skrypt który korzysta z trzech baz danych założenie było takie żeby podczas wykonywania skryptu były maksymalnie trzy połączenia z bazą dlatego chciałem zimplementować wzorzec singleton dl a każdej z baz jednak problem jest taki że podczas wywołania klasy z połączeniem do drugiej bazy połączenie z pierwszą zostaje przerwane po niżej przykładowy kody
Klasa db to standardowa klasa mająca metody typu query fetch itp Ma ktoś pomysł jak można to rozwiązać ![]() Z góry dzięki za sugestie. Ten post edytował patryczakowy 22.01.2011, 08:07:27 -------------------- Sztuką jest widzieć to czego nie widać.
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 156 Pomógł: 31 Dołączył: 23.02.2009 Skąd: Sanok Ostrzeżenie: (0%) ![]() ![]() |
Wg mnie powinieneś łączenie z bazą danych przenieść do konstruktora bazy DB, a w klasach które po niej dziedziczą wywoływać konstruktor rodzica przez parent::__construct(), nie ma sensu tego pchać do każdej klasy w dodatku jeśli będziesz chciał zmienić dane do BD to bedziesz to zmieniał w N klasach? Trochę to niewygodne.
Co do Singeltona, to błędnie go implementujesz. Rzuć okiem na kod:
Tak jak powyżej, jeśli po pierwszym utworzeniu obiektu "klasa", spróbujesz go utworzyć jeszcze raz (new Klasa) to zostanie zwrócony już istniejąca instancja "klasa" IMHO mamy PDO, mamy ORM a ludzie dalej korzystają z niewygodych, przestarzałych funkcji typu mysql_query itp. ... |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 1 182 Pomógł: 115 Dołączył: 4.03.2009 Skąd: Myszków Ostrzeżenie: (0%) ![]() ![]() |
Użyj np. Doctrine DBAL (czy nawet całego ORMa), załatwi sprawę kilku połączeń. Albo po prostu PDO. Mysql_ było dobre może 5 lat temu, nie pamiętam kiedy wszedł PHP 5 z PDO.
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
@Smertius: Proponuje Ci sprawdzać swój kod przed podaniem, bo kompletne bzdury wypisujesz...
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 156 Pomógł: 31 Dołączył: 23.02.2009 Skąd: Sanok Ostrzeżenie: (0%) ![]() ![]() |
Tzn?
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 420 Pomógł: 44 Dołączył: 22.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
(..) nie ma sensu tego pchać do każdej klasy w dodatku jeśli będziesz chciał zmienić dane do BD to bedziesz to zmieniał w N klasach? Trochę to niewygodne. Tak w N klasach bo mam N baz danych ![]() Co do Singeltona, to błędnie go implementujesz. Rzuć okiem na kod: Co do implementacji wzorca singleton to zaczerpnełem go z tej książki Tak jak powyżej, jeśli po pierwszym utworzeniu obiektu "klasa", spróbujesz go utworzyć jeszcze raz (new Klasa) to zostanie zwrócony już istniejąca instancja "klasa" IMHO mamy PDO, mamy ORM a ludzie dalej korzystają z niewygodych, przestarzałych funkcji typu mysql_query itp. ... i tak samo działa moja klasa objekt jest ale nie mam już połączenia z bazą danych gdyż wcześniej zainicjowałem połączenie z drugą bazą danych Cytat Użyj np. Doctrine DBAL (czy nawet całego ORMa), załatwi sprawę kilku połączeń. Albo po prostu PDO. Mysql_ było dobre może 5 lat temu, nie pamiętam kiedy wszedł PHP 5 z PDO. Wygodne nie wygodne jak się ma masę kodu do przerobienia to się kombinuje tak żeby wszystkiego nie trzeba było pisać od początku, a było w miarę optymalne jeśli zainicjuje trzy połączenia do trzech różnych baz danych przy pomocy PDO to te trzy połączenia będą istnieć cały czas równolegle ![]()
jeśli w kodzie gdzieś dalej istniało coś takiego to wszystko działało bez konieczności ingerencji w już napisany kod -------------------- Sztuką jest widzieć to czego nie widać.
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 4 655 Pomógł: 556 Dołączył: 17.03.2009 Skąd: Katowice Ostrzeżenie: (0%) ![]() ![]() |
A do manuala nie łaska zajrzeć?
Cytat resource mysql_connect ([ string $serwer = ini_get("mysql.default_host") [, string $nazwa_użytkownika = ini_get("mysql.default_user") [, string $hasło = ini_get("mysql.default_password") [, bool $nowe_połączenie = false [, int $flagi_klienta = 0 ]]]]] ) -------------------- Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 420 Pomógł: 44 Dołączył: 22.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
A do manuala nie łaska zajrzeć? sorki ale może nie zawsze umiem wyciągnąć z manula to co mi potrzebne, niezabardzo wiem z jakimi parametrami mam wywołać to mysql_connect aby działało tak jak ja chcę mysql_connect , nawet jeślim dam tak to nie działa, czemu zresztą się nie dziwię gdyż przy drugim wywołaniu objekt istnieje więc konstruktor nie jest wywoływany, z resztą takie było założenie żeby z bazą łączyć się tylko raz chyba coś przekombinowałem powoli zaczyna dochodzić do mnie że bez przepisania wszystkiego pożądanego efektu nie osiągnę niemniej jednak czekam na jakieś koło ratunkowe -------------------- Sztuką jest widzieć to czego nie widać.
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. mysql_query powinno mieć określone z którego połączenia korzysta (patrz drugi argument funkcji).
2. Przestań korzystać z Singletona, bo na stronach WWW jest naprawdę baaaaardzo niewiele sytuacji, gdzie jego użycie miałoby sens, a korzystanie z tego wzorca poza jedną zaletą (powodem, dla którego stworzono go - czyli zapewnieniem istnienia co najwyżej jeden instancji danej klasy) ciągnie za sobą masę problemów. 3. Zapewne korzystasz z Singletona by uzyskać globalny dostęp do bazy danych (to jest złe użycie oczywiście), ale mógłbyś wykorzystać coś takiego:
Cytat Tzn? To znaczy, że to co podałeś nie jest Singletonem. To papka bezsensownego kodu (konstruktor zwracający coś? wtf?!)
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 420 Pomógł: 44 Dołączył: 22.10.2008 Ostrzeżenie: (0%) ![]() ![]() |
To co podałeś rozwiązało prawie cały problem i wielkie dzięki, jednak tak jak pisałem wcześniej niestety wiąże się to z przepisaniem wszystkich wystąpień mysql_query, a chciałem tego uniknąć jak widać nie da rady, ale może to i lepiej przy okazji przejże wszystkie zapytania do bazy
![]() -------------------- Sztuką jest widzieć to czego nie widać.
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Jeżeli i tak jesteś zmuszony przepisać zapytania to skorzystaj z PDO, które mimo iż nie idealne jest znacznie lepszym interfejsem niż funkcje mysql_*().
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 22.08.2025 - 04:43 |