Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z przekazaniem instancji klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
bartolomeo
Mam taki problem. Najlepiej chyba jak pokażę kod i błąd.


Klasa kontrolera (wrzucam konkretny fragment kodu)
  1. $link = new MySQLConnect('localhost', 'root', '');
  2. $this->_connection = $link->getConnection();
  3. $this->_dbConnection = new MySQLQuery('mvc', $this->_connection);
  4.  
  5. require_once('model/UserModel.class.php');
  6. $this->_userModel = new UserModel('pinokio', $this->_dbConnection);
  7.  
  8. $this->_userModel->registerUser('pinokio', 'pinokio@pinokio.com');


a błąd wygląda tak:
Cytat
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in
...

Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in ...

(powtarza się to kilka razy)

Warning: mysql_query(): 13 is not a valid MySQL-Link resource in...


W każdym razie nie wiem w czym leży problem bo kiedy korzystajac z tych samych klas MySQLConnect oraz MySQLQuery tylko poprzez plik testowy ktorego zawartosc wyglada tak:
  1. $link = new MySQLConnect('localhost', 'root', '');
  2. $login = 'admin';
  3. $password = 'pinokio';
  4. $email = 'admin@localhost';
  5. $datas = array('login' => $login,
  6. 'password' => sha1(md5($password)),
  7. 'email' => $email');
  8. $link2 = $link->getConnection();
  9. $connection = new MySQLQuery('mvc', $link2);
  10. $result = $connection->dbInsert('users', $datas);


nie występuje żaden problem :|

Prosze o pomoc, z góry dziekuje ! winksmiley.jpg
pedro84
A angielski w szkole miałeś?

Cytat
Access denied for user 'www-data'@'localhost' (using password: NO) in
bartolomeo
No fantastycznie, a powiedz mi jakim cudem wystepuje taki problem jak loguje sie na roota i skad w ogole sie bierze taki uzytkownik, sprawdzalem na windowsie mam zainstalowanego xamppa i jest ten sam problem tylko jakos inaczej sie nazywa ten uzytkownik ktory wyskakuje w warningu
pedro84
Wklej cały błąd Access Denied, mam na myśli w której linii występuje błąd (sprawdź tę linię).
bartolomeo
Jest to fragment klasy obslugi zapytań SQL, ale jak już pisałem problem nie występuje gdy wywołuje to samo zapytanie itd przez użycie jednego pliku w który jest wszystko, tego testowego ktory wyżej zamiesciłem.


a tutaj ta linia (jest to ta return...):
  1. public function string($string){
  2. }
zend
Zaimplementuj system obslugi bledow do mysqli, na google jest mnostwo przykladow i zmien uzytkownika albo haslo albo to i to, bo uzytkownik root nie ma uprawnien w tym konkretnym przypadku (moze wystarczy dodac samo haslo), uprawnienia do bazy trzymaj w jednym miejscu, a nie uzytaj hasla i loginu przy kazdym polaczeniu do bazy, po w przypadku gdy bedziesz musial zmienic te dane, bedziesz musial przeszukac wszystkie pliki w celu zmiany, najlepiej do tego nadaja sie stale link, muszi stworzyc plik konfiguracyjny w ktorym zdefiniujesz stale i includowac go do kazdego skryptu. Mam nadzjeje ze jestes w stanie zrozumiec to co napisalem smile.gif

Pozdrowionka Zend
bartolomeo
Mam system obsługi błędów i na końcu błedu wywala jeszcze:
Cytat
Komunikat błędu: Błąd przy zapytaniu


który to dokładnie jest przy:
  1. if(!$this->_result = mysql_query($this->query, $this->_connection)){
  2. throw new MyException('Błąd przy zapytaniu');
  3. }

No w każdym razie, wnioskuje z tego, że coś nie tak z przekazanym obiektem połączenia z bazą. A co do danych do bazy to mam zrobiony plik konfiguracyjny i są ladowane tylko raz, wiec nie bedzie żadnych problemów przy zmianie passów do bazy. Dodatkowo do root'a jest ustawione hasło, tylko tutaj akurat je wyciąłem, ale normalnie z niego korzystam i w dalszym ciągu problem występuje nawet jeśli utworzyłem innego użytkownika i z niego korzystam sad.gif
pedro84
Dziwne, bardzo. Możesz wrzucić całą klasę jako załącznik?
bartolomeo
Nie ma problemu. Wrzucam wszystko, gdzie tylko mogłaby zawierać się przyczyna

http://www.sendspace.pl/file/f29915b8b4739bea0e3870f

hasło do archiwum: php.pl

(albo jestem niewidomy, albo po prostu nie mam opcji dodania załącznika do posta)
zend
na pierwszy rzut oka to warto by sie bylo zastanowic nad tymi linijkami (tzn czy przekazujesz prawidlowe dane smile.gif ,a poza tym w tych twoich klasach az sie prosi o typowanie, uniknal bys dzieki temu masy bledów)
  1. $this->_connection = $link->getConnection();
  2. $this->_dbConnection = new MySQLQuery('mvc', $this->_connection);
  3.  
  4. require_once('model/UserModel.class.php');
  5. $this->_userModel = new UserModel('pinokio', $this->_dbConnection);
bartolomeo
Zastanawiałem się wielokrotnie nad tymi linijkami i z pewnością przekazuje dobre dane, robię to w identyczny sposób jak w pliku testowym, który na początku tematu zamieściłem, a w którym błąd nie występuje. Co do typowania to może później, na razie chciałbym się jakoś uporać z tym błędem bo jest on kluczowy w działaniu aplikacji, którą piszę.

Jeśli nie potrafisz mi pomóc to proszę Cię żebyś napisał (może być totalnie abstrakcyjny przykład klas) w jaki sposób Ty przekazujesz obiekt połączenia z bazą do innej klasy. Może własnie sposób w jaki to robię jest błędny, nie wiem
zend
Przekazujesz instancje do zlego obiektu, do modelu powinienes przekazac _connection i powinno zadzialac
bartolomeo
Mógłbyś mi pokazać wyedytowany plik, bo nie wiem co masz konkretnie na myśli? (przepraszam, że zabieram Ci tyle czasu, nie wynika to z mojego lenistwa, tylko zmienna $_connection wystepuje prawie w każdym z tych plików, a poza tym jest już przekazywana do modelu, jeśli możesz to po prostu pokaż na konkretnym pliku)
zend
  1. $link = new MySQLConnect('localhost', 'root', '');
  2. $this->_connection = $link->getConnection();
  3. $this->_dbConnection = new MySQLQuery('mvc', $this->_connection);
  4.  
  5. require_once('model/UserModel.class.php');
  6. $this->_userModel = new UserModel('pinokio', $this->_connection);
  7.  
  8. $this->_userModel->registerUser('pinokio', 'pinokio@pinokio.com');
Spróbuj odpalić to
bartolomeo
Proszę, oto efekt:

Cytat
Fatal error: Call to a member function dbInsert() on a non-object in /home/bart/public_html/model/UserModel.class.php on line 21


Ale to jest bez sensu, bo spójrz na klasę UserModel, a następnie na to co ona wywołuje, ona potrzebuje obiektu klasy MySQLQuery (połączenia już z konkretną bazą danych a nie z serwerem mysql).


EDIT: Dodam, że właśnie to co mnie dziwi to fakt, że tutaj problem nie występuje:
  1. $link = new MySQLConnect('localhost', 'root', '');
  2. $login = 'admin';
  3. $password = 'pinokio';
  4. $email = 'admin@localhost';
  5. $datas = array('login' => $login,
  6. 'password' => sha1(md5($password)),
  7. 'email' => $email');
  8. $link2 = $link->getConnection();
  9. $connection = new MySQLQuery('mvc', $link2);
  10. $result = $connection->dbInsert('users', $datas);


Chociaż sposób działania jest praktycznie identyczny (korzysta z tych samych klas połączenia z bazą)
zend
Jedyną różnicą jest tu brak modelu. Jedyne co mi przychodzi na mysl, to przerzuc dane z tego dzialajacego pliku do kontrolera i zamieniaj linijka po linijce na to co nie działa, wkońcu powinien się znaleźć ten błąd
bartolomeo
DZIAŁA ! Wystarczyło zamienić:
  1. [b]$link[/b] = new MySQLConnect('localhost', 'root', '');
  2. $this->_connection = [b]$link[/b]->getConnection();
  3. $this->_dbConnection = new MySQLQuery('mvc', $this->_connection);
  4.  
  5. require_once('model/UserModel.class.php');
  6. $this->_userModel = new UserModel('pinokio', $this->_dbConnection);
  7.  
  8. $this->_userModel->registerUser('pinokio', 'pinokio@pinokio.com');


na

  1. [b]$this->_link[/b] = new MySQLConnect('localhost', 'root', '');
  2. $this->_connection = [b]$this->_link[/b]->getConnection();
  3. $this->_dbConnection = new MySQLQuery('mvc', $this->_connection);
  4.  
  5. require_once('model/UserModel.class.php');
  6. $this->_userModel = new UserModel('pinokio', $this->_dbConnection);
  7.  
  8. $this->_userModel->registerUser('pinokio', 'pinokio@pinokio.com');


Dzięki wszystkim zaangażowanym za poświęcony czas, pozdrawiam smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.