![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Posiadam serwer w pewnej firmie hostingowej. Mam problem ze skryptem php. 1. Łączę się z bazą danych - wszystko jest ok 2. wykonuje jakiekolwiek zapytanie do bazy danych np.: instrukcje SELECT - wszystko jest ok 3. następnie wykonuje jakiekolwiek inne zapytanie do bazy danych mysql i wyskakuje błąd: Błąd MySQL #1045: Access denied for user 'XXX'@'localhost' (using password: NO) Co ciekawe: XXX - jest to pierwszy użytkownik, pierwszej bazy danych jaką stworzyłem na tym serwerze dawno temu. Do połączenia z bazą (w mysql_connect) NIE używam tego użytkownika tylko zupełnie innego YYY. Skrypt jakby sam przełącza na tego użytkownika po zakończeniu pierwszego zapytania. Kiedy zorientowałem się że samoistnie przełącza tego użytkownika pomyślałem że w takim razie będę używał XXX do łączenia się z bazą danych, to skrypt nie będzie musiał go przełączać - niestety, ten sam błąd. Użytkownik XXX i YYY mają takie same uprawnienia. (wszystkie) Bardzo proszę o pomoc. Ten post edytował Hesto 14.11.2013, 14:16:10 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Sprawdź czy gdzieś w skrypcie nie jest ładowany plik, z tymi starymi danymi lub gdzieś jest błąd. Raczej wątpie, żeby skrypt sam się w taki sposób przełączał.
Druga sprawa to taka, że mimo iż hasła są identyczne przy drugiej próbuje połączenia nie jest ono podawane, o czym świadczy treść komunikatu: Kod (using password: NO)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
a skrypt robi coś takiego
Nic innego nie odpowiada zapołączenie z bazą danych Zauważyłęm że problem występuje tylko wtedy kiedy zapytanie mysql jest w funkcji w jakiejś klasie czyli: $db = new database; $db - > connect(); $user = new user; $user -> load($user); i tutaj właśnie jest zapytanie $user -> load($user2); jeśli spróbuje wczytać innego użytkownika ponownie to wyskakuje powyższy błąd. Wniosek mogę używać mojego obiektu bazy danych do wykonania zapytania tylko raz ... Ten post edytował Hesto 14.11.2013, 15:04:19 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Mógłbyś pokazać jeszcze jak wygląda metoda load klasy user?
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
Chciałem tego uniknąć bo nie jest to wszystko eleganckie (IMG:style_emoticons/default/tongue.gif) no ale trudno:
problem rozwiązuje się wtedy kiedy w skrypcie głównym przed wejściem w tą funkcję (load) zamknę połączenie z bazą danych czyli zniszczę obiekt $db, i otworze połączenie ponownie w funkcji load ($db -> connect()(IMG:style_emoticons/default/wink.gif) . Teorytycznie mógłbym tak zrobić, ale przy wczytywaniu 1000 produktów czy użytkowników, łączenie się z bazą danych 1000 razy i rozłączanie, jest nieco żałosne. Od kilku dni próbuje rozwiązać ten problem i nic nie przychodzi mi do głowy. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Funkcje z rodziny mysql_* przyjmują także jako parametr opcjonalny identyfikator połączenia. Mógłbyś we wszystkich wywołaniach tych funkcji podać identyfikator poprawnego połączenia.
Co do namierzenia błędnego połączenia to możesz w metodzie łączącej się z bazą wyrzucić wyjątek w przypadku niepowodzenia, zamiast Twojej funkcji sqlError. W tedy będziesz miał podaną dokładną trase wywołania i bez problemu powinno się znaleźć problem. |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
Z tym indentyfikatorem połączenia to mogę spróbować jak naprawdę nie będzie wyjścia, tymczasem zobaczę co pokaże wyjątek i wstawię tutaj zaraz.
|
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Tak z innej beczki, w jaki sposób przekazujesz dane do logowania do klasy? Zaszyte są na sztywno?
Druga sprawa to za każdym razem jak chcesz odwołać się do bazy tworzysz nową instancję? Przecież to jest nowe połączenie do bazy i strata czasu. Zaimplementuj w klasie wzorzec singleton lub znajdź sposób na przechowywanie jednej instancji klasy globalnie i do niej sie odwołuj. Przyśpieszy to działanie skryptu. |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
Tak, dane są wpisane w klasie na sztywno.
wyjątek został wyrzucony tutaj (metoda "add" jest używana jako drugie zapytanie do mysql). Czyli nic to nie dało ponieważ wiedzieliśmy że wyrzuca błąd w drugim zapytaniu z kolei. Jak już powiedziałem kod nie jest elegancki (IMG:style_emoticons/default/tongue.gif) . Nie jestem profesjonalnym programistą, a samoukiem-amatorem. Jeśli powiesz mi na jakiej zasadzie zaimplementować to inaczej to chętnie to zrobię. W każdym razie wszystko sprowadza się do jednego pytania: dlaczego wyskakuje błąd 1045 jeśli skrypt wchodzi do jakiejś funkcji i wykonuje tam zapytanie? Jeśli tylko nie wchodzi do funkcji, mogę pisać ile zapytań mi się podoba. Ten post edytował Hesto 14.11.2013, 16:23:20 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dziwne rzeczy to sie dzieją, ale na pewno jest jakieś logiczne wytłumaczenie. Spróbuj zastosować metode gumowej kaczuszki. Co do samej klasy zaś to chyba najszybszym rozwiązaniem będzie zmiana atrybutu connection na statyczny. W tedy w kontrolerze sprawdzasz czy połączenie zostało już nawiązane, jeśli nie tworzysz nowe, jeśli tak wychodzisz z kontrolera.
Jeśli chciało by Ci się trochę pobawić możesz zaimplementować singleton. Przykładowa klasa wygląda mniej więcej tak:
|
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
Okej, pobawie się jeszcze w Singletonie ale to na pewno nie naprawi mojego problemu. Celowo napisałem temat w dziale "MySQL" ponieważ jestem na 99,99% pewny że problem leży w konfiguracji phpmyadmin. Sam kod PHP nie ma tu nic do rzeczy. Czytałem gdzieś że błąd 1045 wwygląda tak: jeśli MySQL wykonuje zapytanie ponownie to nie wie z którego użytkownika skorzystać dlatego korzysta z pierwszego od góry. Dla pierwszego od góry nie jest ustawione hasło czy coś takiego i występuje błąd. Niestety nie mam pojęcia jak to naprawić.
Próbowałem zmienić hasło wszystkim użytkownikom - nic to nie pomogło. Chciałem zobaczyć tabele user czyli Select * from mysql.user Niestety wyskoczyło mi że nie mam uprawnień. Nie rozumiem tylko jakim cudem nie mam uprawnień jeśli było to konto admina. W dodatku w miejscu po zalogowaniu się do phpmyadmin, tam gdzie wybiera się bazę danych mam napisane przy przycisku "utwórz bazę danych", "brak uprawnień". Śmieszne jest to że nie mogę stworzyć nowej bazy danych z poziomu phpmyadmin ale z poziomu DirectAdmin już mogę. Zaczynam przypuszczać że to wszystko ma coś wspólnego z uprawnieniami lub firma hostingowa za którą płacę 30 zł rocznie, z którą są same problemy (ale jest tania) źle mi skonfigurowała serwer. Z drugiej strony przez wiele lat na tym serwerze stała strona w joomli 1.5 + virtuemart i wszystko śmigało bez zarzutu. |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat jestem na 99,99% pewny że problem leży w konfiguracji phpmyadmin PhpMyAdmin jest tylko narzędziem do przeglądania baz danych, tak jak przeglądarka jest narzędziem do przeglądania zasobów internetu (IMG:style_emoticons/default/smile.gif) Jak już to zapewne masz na myśli konfigurację serwera mysql, aczkolwiek to raczej nie ona jest problemem. Bardzo możliwe, że po poprawieniu połączeń skrypt zacznie działać. Tworzyłeś wiele połączeń i nie podawałeś informacji, z którego będziesz korzystał, więc skrypt mógł głupieć bo nie wiedział. Nie mam pewności, ale zapewne pierwsze połączenie było w globalnym zakresie zmiennych, więc nie był wywoływany destruktor zamykający połączenie. Później pojawiało się drugie połączenie i przy wysłaniu zapytania skrypt nie wie, którego użyć. Blokada tworzenia bazy danych z phpmyadmina jest częstą praktyką. Nie chodzi o zlośliwość, ale o synchronizacje między tym co jest w panelu klietna, a tym co faktycznie jest na serwerze. Popraw sposób łaczenia do bazy danych i zobaczymy co będzie się działo. Ten post edytował freemp3 15.11.2013, 12:10:22 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 11 Pomógł: 0 Dołączył: 14.11.2013 Ostrzeżenie: (0%) ![]() ![]() |
Skrypt jest prościutki i składa się dosłownie z kilku linijek. Jak sam na pewno zauważyłeś, w klasie database jest funkcja connect() która nie jest wywoływana w konstruktorze. Więc jeśli tworze obiekt typu database to tylko po to aby używać metod do zapytań. Łączę się z bazą tylko jeden jedyny raz więc nie ma możliwości że skrypt nie wie z którego korzystać.
Ja obstawiam że problem leży w uprawnieniach lub błędnej konfiguracji serwera mysql. Niestety nie mam pojęcia jak to naprawić. Ten post edytował Hesto 15.11.2013, 13:34:26 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 467 Pomógł: 77 Dołączył: 6.09.2008 Skąd: Miechów / Kraków Ostrzeżenie: (0%) ![]() ![]() |
Gdzieś musi być połączenie wykonywane drugi raz, ponieważ wstawiłeś przecież wyrzucanie wyjątku w przypadku błędu przy połączeniu, czyli w metodze sqlConnect. Poza tym, sam zauważyłeś, że przy usunięciu pierwszej instancji i rozłączeniu z bazą danych drugie połączenie wykonuje się poprawnie (IMG:style_emoticons/default/smile.gif)
Hmm... Może właśnie tutaj jest problem. Próbowałeś wywołać metodę sqlConnect przed zapytaniem powodującym błąd? Jak pisałem wcześniej nie wiem, czy instancja jest trzymana w globalnym zakresie czy w lokalnym, więc strzelałem. Sprawdź drugą możliwość, czyli tworzysz pierwszą instancje ona coś robi, później wychodzisz z zakresu ważności i jest usuwana. Przy drugim wywołaniu nie masz już połączenia bo zostało usunięte wcześniej i mysql próbuje się zalogować na pierwszego użytkownika z brzegu, co skutkuje owym komunikatem. Ten post edytował freemp3 15.11.2013, 13:56:18 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 04:55 |