Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Klasa do do zarządzania bazą danych
Forum PHP.pl > Forum > Przedszkole
qz12
Witam,
próbuję stworzyć klasę do zarządzania bazą danych:
  1. include './config.php';//polaczenie z baza
  2.  
  3. class DaneUzytkownika
  4. {
  5.  
  6. protected $dane = array();
  7.  
  8. function __construct($dane = array())
  9. {
  10. if (is_array($dane))
  11. $this->dane = $dane;
  12. else if ($dane instanceof DaneUzytkownika)
  13. $this->dane = $dane->pobierzJakoTablica();
  14. }
  15.  
  16.  
  17. function __get($parametr)
  18. {
  19. if (isset($this->dane[$parametr]))
  20. return $this->dane[$parametr];
  21. return '';
  22. }
  23.  
  24. // ustawia atrybut
  25. function __set($parametr, $wartosc)
  26. {
  27. $this->dane[$parametr] = $wartosc;
  28. }
  29.  
  30. // zwraca dane w postaci listy par klucz='wartosc'
  31. // oddzielonych przecinkiem
  32. function pobierzListeDanych()
  33. {
  34. $list = '';
  35. foreach($this->dane as $atrybut => $wartosc)
  36. $list .= $atrybut.'=\''.addslashes($wartosc).'\'';
  37. return $list;
  38. }
  39.  
  40. // zwraca listę atrybutow oddzielonych przecinkiem
  41. function pobierzListeAtrybutow()
  42. {
  43. return join(', ', array_keys($this->dane));
  44. }
  45.  
  46. // zwraca listę wartości oddzielonych przecinkiem
  47. function pobierzListeWartosci()
  48. {
  49. $values = array();
  50. foreach($this->dane as $wartosc)
  51. $values[] = '\''.addslashes($wartosc).'\'';
  52. return join(', ', $values);
  53. }
  54.  
  55. // zwraca dane w postaci tablicy (zwraca przez wartosc)
  56. function pobierzJakoTablica()
  57. {
  58. return $this->data;
  59. }
  60. }
  61.  
  62. class Uzytkownik extends DaneUzytkownika
  63. {
  64. private $dane_w_bazie;
  65.  
  66. // konstruktor - tworzenie obiektu
  67. function __construct(&$dane, $baza)
  68. {
  69. parent::__construct();
  70.  
  71. if ($this->dane)
  72. $this->dane_w_bazie = new DaneUzytkownika($this->dane);
  73. }
  74.  
  75.  
  76.  
  77. function zapisz()
  78. {
  79. mysql_query('UPDATE users SET '.$this->pobierzListeDanych().' WHERE '.$this->dane_w_bazie->pobierzListeDanych());
  80. {
  81. $this->dane_w_bazie = $this->dane;
  82. return true;
  83. }
  84. return false;
  85. }
  86.  
  87. function usun()
  88. {
  89. mysql_query('DELETE FROM users WHERE '.$this->pobierzListeDanych());
  90. return (bool) mysql_affected_rows();
  91. }
  92. }
  93.  
  94. class BazaUzytkownikow
  95. {
  96. function pobierz(DaneUzytkownika $szukamy)
  97. {
  98. $query = mysql_query('SELECT * FROM users WHERE '.$szukamy->pobierzListeDanych());
  99. if (mysql_num_rows($query))
  100. return new Uzytkownik(mysql_fetch_assoc($query));
  101. return false;
  102. }
  103.  
  104. function dodaj(DaneUzytkownika $dane)
  105. {
  106. mysql_query('INSERT INTO users('.$dane->pobierzListeAtrybutow().') VALUES('.$dane->pobierzListeWartosci().')');
  107. return new Uzytkownik($dane, $this);
  108. return false;
  109. }
  110.  
  111. function zapisz($dane)
  112. {
  113. if ($dane instanceof Uzytkownik)
  114. $dane->zapisz();
  115. else
  116. $this->dodaj($dane);
  117. }
  118.  
  119. function usun(Uzytkownik $uzytkownik)
  120. {
  121. return $uzytkownik->usun();
  122. }
  123. }
  124.  
  125. $baza = new BazaUzytkownikow;
  126.  
  127.  
  128. $szukamy = new DaneUzytkownika;
  129. $szukamy->user_name= 'rr';
  130.  
  131.  
  132. $uzytkownik = $baza->pobierz($szukamy);
  133.  
  134. // zmieniam dane pobranego wcześniej użytkownika
  135. $uzytkownik->user_from = 'nowy gościu';
  136. //próbuje zapisać zmiany
  137. $baza->zapisz($uzytkownik);

Otrzymuję komunikat :
Catchable fatal error: Argument 1 passed to BazaUzytkownikow::dodaj() must be an instance of DaneUzytkownika
Co robię źle ?
SmokAnalog
W deklaracji metody dodaj() masz, że przyjmuje jako argument instancję klasy DaneUzytkownika, a Ty próbujesz tam wcisnąć jakiś inny typ.
qz12
Heh, trudno się domyślić... A jak rozwiązać ten problem ?
nospor
No przeciez masz wyraznie napisane...... Masz tam zapodac obiekt klasy DaneUzytkownika.
Tutaj zdaje sie tworzysz taki obiekt
$szukamy = new DaneUzytkownika;
, wiec to jego masz przekazywac.
qz12
Więc przekazuje
  1. $baza = new BazaUzytkownikow;
  2. $szukamy = new DaneUzytkownika;
  3. $szukamy->user_name = 'rr';
  4. $szukamy->user_from = 'gdziediabelmowidobranoc';
  5. echo "szukamy jest klasy " , get_class($szukamy) , "\n";
  6. $uzytkownik = $baza->pobierz($szukany);

i otrzymuje
Catchable fatal error: Argument 1 passed to BazaUzytkownikow::pobierz() must be an instance of DaneUzytkownika, null given...
bazowałem na przykładzie stad
markuz
$szukany != $szukamy
...
Pyton_000
Cytat
$uzytkownik = $baza->pobierz($szukany);

Cytat
$szukamy = new DaneUzytkownika;


Znajdź 10 różnic
qz12
Poprawiłem literówki
  1. <?php
  2. include './config.php';
  3. db_connect();
  4. class DaneUzytkownika
  5. {
  6. // nasza wlasciwosc, chroniona przed dostepem z zewnatrz
  7. public $dane = array();
  8.  
  9. function __construct($dane = array())
  10. {
  11. if (is_array($dane))
  12. $this->dane = $dane;
  13. else if ($dane instanceof DaneUzytkownika)
  14. $this->dane = $dane->pobierzJakoTablica();
  15. }
  16.  
  17. // zwraca atrybut
  18. function __get($parametr)
  19. {
  20. if (isset($this->dane[$parametr]))
  21. return $this->dane[$parametr];
  22. return '';
  23. }
  24.  
  25. // ustawia atrybut
  26. function __set($parametr, $wartosc)
  27. {
  28. $this->dane[$parametr] = $wartosc;
  29. }
  30.  
  31. // zwraca dane w postaci listy par klucz='wartosc'
  32. // oddzielonych przecinkiem
  33. function pobierzListeDanych()
  34. {
  35. $args= array();
  36. foreach($this->dane as $atrybut => $wartosc)
  37. $args[]= $atrybut.'=\''.addslashes($wartosc).'\'';
  38. return join(' AND ', $args);
  39. }
  40.  
  41. // zwraca listę atrybutow oddzielonych przecinkiem
  42. function pobierzListeAtrybutow()
  43. {
  44. return join(', ', array_keys($this->dane));
  45. }
  46.  
  47. // zwraca listę wartości oddzielonych przecinkiem
  48. function pobierzListeWartosci()
  49. {
  50. $values = array();
  51. foreach($this->dane as $wartosc)
  52. $values[] = '\''.addslashes($wartosc).'\'';
  53. return join(', ', $values);
  54. }
  55.  
  56. // zwraca dane w postaci tablicy (zwraca przez wartosc)
  57. function pobierzJakoTablica()
  58. {
  59. return $this->data;
  60. }
  61. }
  62.  
  63. class Uzytkownik extends DaneUzytkownika
  64. {
  65. public $dane_w_bazie;
  66.  
  67. // konstruktor - tworzenie obiektu
  68. function __construct($dane, $baza)
  69. {
  70. parent::__construct();
  71.  
  72. if ($this->dane)
  73. //$this->dane_w_bazie = new DaneUzytkownika($this->dane);
  74. $this->dane_w_bazie = new DaneUzytkownika($dane);
  75. }
  76.  
  77. function wyswietl()
  78. {
  79.  
  80. }
  81.  
  82. function zapisz()
  83. {
  84. mysql_query('UPDATE users SET '.$this->pobierzListeDanych().' WHERE '.$this->dane_w_bazie->pobierzListeDanych());
  85. {
  86. $this->dane_w_bazie = $this->dane;
  87. return true;
  88. }
  89. return false;
  90. }
  91.  
  92. function usun()
  93. {
  94. mysql_query('DELETE FROM users WHERE '.$this->pobierzListeDanych());
  95. return (bool) mysql_affected_rows();
  96. }
  97. }
  98.  
  99. class BazaUzytkownikow
  100. {
  101. function pobierz(DaneUzytkownika $szukamy)
  102. {
  103. $query=mysql_query('SELECT * FROM users WHERE '.$szukamy->pobierzListeDanych());
  104. if (mysql_num_rows($query)) {
  105. return( new Uzytkownik (mysql_fetch_assoc($query)));
  106. }
  107. return false;
  108. }
  109.  
  110. function dodaj(DaneUzytkownika $dane)
  111. {
  112. mysql_query('INSERT INTO users('.$dane->pobierzListeAtrybutow().') VALUES('.$dane->pobierzListeWartosci().')');
  113. return new Uzytkownik($dane, $this);
  114. return false;
  115. }
  116.  
  117. function zapisz(DaneUzytkownika $dane)
  118. {
  119. if ($dane instanceof Uzytkownik)
  120. $dane->zapisz();
  121. else
  122. $this->dodaj($dane);
  123. }
  124.  
  125. function usun(Uzytkownik $uzytkownik)
  126. {
  127. return $uzytkownik->usun();
  128. }
  129. }
  130. $baza = new BazaUzytkownikow;
  131. $szukamy = new DaneUzytkownika; // tworzymy nową jakby tablicę na dane
  132. $szukamy->user_name = 'aaa'; // podajemy login szukanego uzytkownika
  133. $szukamy->user_from = 'gdziediabrlmowidobranoc'; // mozemy takze podac inny parametr
  134. //echo "szukamy jest klasy " , get_class($szukamy) , "\n";
  135.  
  136. $uzytkownik = $baza->pobierz($szukamy); // wyszukujemy w bazie przekazując jej dane z tablicy, baza zwraca nam Użytkownika
  137. var_dump($uzytkownik);
  138.  
  139. // zmieniamy dane pobranego wcześniej użytkownika
  140. //$uzytkownik->user_from = 'Tajemniczy gościu9';
  141.  
  142. $uzytkownik->zapisz();
  143. //$baza->zapisz($szukamy);

Pojawia sie błąd
Call to a member function pobierzListeDanych() on a non-object
Nie przypisuje do zmiennych obiektu wartości :object(Uzytkownik)#3 (2) { ["dane_w_bazie"]=> NULL ["dane"]=> array(0) { } }

nospor
Byloby jeszcze milo, jakbys raczyl napisac ktorej linii dotyczy blad, gdyz pobierzListeDanych to ty odpalasz w wielu roznych miejscach... WEź pod uwage fakt, ze tu wrozek nie ma.
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.