![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 150 Pomógł: 3 Dołączył: 13.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
W odzielnym pliku mam zapis połączenia z bazą danych za pomocą mysql dołączony do głównego pliku. W innym pliku mam stworzona klasę którą teraz dołączam do głównego pliku także. Słyszałem że mysqli jest efektywniejsze a mi nie działa połączenie z bazą danych w klasie na mysqli a na mysql działa bez zastrzeżeń. Proszę aby ktoś mi wytłumaczył jak rozwiązać problem z połączeniem za pomocą mysqli oraz czy jest ogromna różnica miedzy mysql a mysqli.
Dziękuje pozdrawiam set4812 |
|
|
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Po pierwsze, to mysql i mysqli są osobnymi rozszerzeniami, które włącza się w plikach konfiguracyjnych. Jeśli Twój usługodawca nie zrobił tego, to określone rozszerzenie nie jest dostępne. najlepiej sprawdź w phpinfo czy masz je włączone czy nie. Różnica między nimi zaś to podejście do danych. Jak już wspomniano, mysqli jest obiektową formą współpracy z bazą. Zajrzyj do manuala na php.net a sam zobaczysz w przykładach różnicę.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 150 Pomógł: 3 Dołączył: 13.04.2010 Ostrzeżenie: (0%) ![]() ![]() |
hmm tyle wiem ze obiektowe , 2 część pytania jak załączyc działanie w classie odzielnej tego obiektu?
znalazłem na forum u was http://forum.php.pl/lofiversion/index.php/ags/t98272.html tylko nie rozumiem kilku elementów Tego przepisania $this->db = $db; oraz w konstruktorze mysqli $db Dziekuje za wytłumaczenie pozdrawiam set4812 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 305 Pomógł: 25 Dołączył: 27.01.2007 Ostrzeżenie: (0%) ![]() ![]() |
O tym jak posługiwać się mysqli znajdziesz w manualu, http://php.net/manual/en/book.mysqli.php
Tego przepisania $this->db = $db; oraz w konstruktorze mysqli $db Tworzysz klasę na wzór wzorca Singleton, tzn. tylko raz wywołujesz połączenie z bazą danych (ponieważ koszt połączenia z bazą jest wysoki, mówiąc najogólniej). We właściwości db przetrzymujesz 'uchwyt' do bazy danych, czyli otwarte połączenie, po to, aby nie musieć za każdym razem wywoływać nowego połączenia (co jak wspomniałem, jest kosztowne dla serwera). To by było tyle z całej logiki, reszte doczytasz w manualu lub stu innych miejscach (jak i znajdziesz gotowe klasy do obsługi bazy danych). |
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Najogólniej rzecz ujmując, to w przykładach widzisz $db, ponieważ jest to uchwyt do bazy danych zadeklarowany przez programistów. Przypisują do niego identyfikator połączenia i wykorzystują za każdym razem gdy chcą z niej skorzystać. To łącznik między skryptem i bazą. Nawet prostszy mysql tak działa, ale bardzo często nie jest on jawnie przekazywany do funkcji mysql_* gdyż ustawia się domyślnie i można go pominąć przy wywołaniu. Zauważ w manualu że 90% funkcji tego typu ma jako ostatni parametr mysql_identifier czy coś w tym stylu. To jest odpowiednik $db. Uzywa się go bowiem rzadko i jedynie w sytuacjach, gdy obsługujemy kilka baz/serwerów mysql w obrębie jednego skryptu. Dzięki przypisaniu $this->db = $db , identyfikator połączenia jest cały czas dla obiektu dostępny.
PS.: W ostatnim swoim przykładzie masz lukę. Nie sprawdzasz czy $res ma cokolwiek w sobie a od razu walisz przypisanie tablicy wyniku do $row. A skąd wiesz, że dostałeś jakikolwiek rekord? A może nie ma takiego w bazie? Pamiętaj, że powinno się zawsze sprawdzać poprawność pobranych danych nie tylko poprzez sprawdzanie czy wystąpił błąd, ale ile rekordów zwróciło zapytanie. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
W takim wypadku wszystko od "$row = $res->fetch_assoc()" włacznie - jest zbędne
![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
A tak podłączając się do tematu, czy można ten obiekt serializować i przenosić między stronami? Bo to jest chyba lepsze, niż na jednej stronie otwierać połączenie, wykonać skrypt, zamykać połączenie i na innej znowu robić to samo?
-------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Można robić coś podobnego. Nie można bowiem przenosić identyfikatora połączenia pomiędzy stronami, ale można utworzyć połączenie stałe (persistent connection -> w mysql funkcja pconnect). Jest one nieco ryzykowne, gdyż trzeba pamiętać o jego kończeniu, inaczej trochę czasu zejdzie zanim wróci ono do puli dostępnych. W skrajnych przypadkach możesz serwis wysypać z powodu przekroczenia dostępnej liczby połączeń. Swego czasu przez to się sypało choćby idg.pl
Ogólnie rzecz biorąc połączenie trwa tak długo jak długo trwa skrypt. Potem i tak z automatu jest zamykane i przesyłanie tutaj jego identyfikatora zwyczajnie nic nie da. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
A w jaki sposób to zrobić? Na początku zrobić jedno połączenie, np przy logowaniu, potem na innych stronach używać tego identyfikatora a po wylogowaniu np zakończyć? Mógłbyś jakiś przykład pokazać? I jak sprawdzić max liczbę połączeń?
-------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Można, ale osobiście nie używałbym ich. Zauważ, że połączenie stałe "rezerwuje slot" połączenia z bazą i nikt inny nie może go użyć. Jest to ryzykowne, ponieważ do czasu aż baza nie dostanie go z powrotem liczba takich połączeń jest zredukowana o jedno. Jeśli osiągnie ona limit - nikt nie będzie mógł połączyć z bazą, a wtedy Twoja strona leży i kwiczy. Liczba takich połączeń ma swój limit na serwerze i różnie to bywa w zależności od wydajności. Zazwyczaj jest to kilkaset i wydaje się dużo, ale zauważ, że userzy potrafią na stronie siedzieć długo bez jakiejkolwiek interakcji. A połączenie trwa i jest blokowane do użytku innych. Trochę userów się zaloguje a liczba dostępnych połączeń się znacznie zredukuje. Zamiast 150, będziesz miał przykładowo 80. Czyli wszyscy niezalogowani mają do dyspozycji nie 150, ale jedynie 80 slotów do bazy. Między siebie. To wydłuża czas oczekiwania na dane, bo zapytania są kolejkowane dla nich i dostają wyniki zapytań gdy tylko baza zdoła. Tak więc takie połączenia powinni mieć najwyżej Ci, których obecność na stronie jest obowiązkowa i muszą oni mieć zawsze z nią kontakt - admini, moderatorzy. Poza tym czy koszt połączenia jest taki naprawdę istotny? Koszt połączenia w zasadzie nie gra roli aż takiej w porównaniu do czasu działania całego skryptu.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Pytam się dlatego, że @kilas88 napisał "ponieważ koszt połączenia z bazą jest wysoki, mówiąc najogólniej" a może się kiedyś okazać, że np będzie ok 1000 userów, którzy będą pracować na bazie. Więc wtedy stałe połączenie nie będzie potrzebne
![]() Wcześniej pisałem skrypt za pomocą mysql_* ale chyba przejdę na obiektowe mysqli. Bo i tak całą stronę przerabiam na obiekty, więc dodatkowa nauka obiektowego mysqli będzie przydatna ![]() -------------------- |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Koszt połączenia jest wysoki przy prostych zapytaniach, bo nieraz ich wykonanie trwa krócej niż samo połączenie. Każde bardziej rozbudowane już jest porównywalne lub dłużej trwające niż czas nawiązania połączenia. A że dla skryptu najczęściej nawiązujesz połączenie tylko raz (praktycznie mało kto używa zwalniania zasobów i mysql_close) i trwa ono do końca skryptu, to summa sumarum wcale tak drogie to nie jest przy choćby kilkunastu prostych zapytaniach w obrębie i czasie trwania tegoż skryptu. Kwestia tego co skrypt robi z bazą danych.
-------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 1 006 Pomógł: 111 Dołączył: 23.07.2010 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
A lepiej jest używać obiektowego mysqli czy normalnego funkcyjnego mysql?
-------------------- |
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
To zależy tak naprawdę tylko od przyzwyczajenia. Aczkolwiek z tego co pamiętam to mysqli lepiej chronił przez sqlinjection. Bo mysql jako rozszerzenie kompletnie nie chroni
![]() Właściwie to poczytaj na necie o różnicach to sam zobaczysz ![]() -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 13.06.2025 - 11:17 |