Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z wcześniej zdefiniowanym obiektem
Forum PHP.pl > Forum > PHP > Object-oriented programming
brzoza91
Witam
Przerabiam książkę i jest tam taka klasa, która trochę zmieniłem. Lecz po uruchomieniu wyskakuje mi wiele błędów. Co robię nie tak, że mam tyle błędów. Np. W 164 LINI wyskakuje taki błąd

Undefined variable: objDB in C:\wamp\www\lookbook\class\class.UserSession.php on line 164

linia ta zawiera taki kod:
  1. $row=$objDB->select($sql);

a gdy zamienie to na:
  1. $row=Datebase::select($sql);



to działa dobrze. Gdzie jest tu błąd skoro w konstruktorze stworzyłem taki obiekt.
?
a to reszta błędów:

1.Undefined index: HTTP_USER_AGENT in C:\wamp\www\lookbook\class\class.UserSession.php on line 27
2.PHPSESSID in C:\wamp\www\lookbook\class\class.UserSession.php on line 28
3.HTTP_USER_AGENT in C:\wamp\www\lookbook\class\class.UserSession.php on line 158
4.Undefined variable: objDB in C:\wamp\www\lookbook\class\class.UserSession.php on line 164
5.Call to a member function select() on a non-object in C:\wamp\www\lookbook\class\class.UserSession.php on line 164

  1. <?php
  2.  
  3. require_once('class.User.php');
  4. require_once('class.Datebase.php');
  5.  
  6. class UserSession extends User{
  7. private $php_sesion_id;
  8. private $native_session_id;
  9. private $dbhandle;
  10. private $logged_in;
  11. private $session_tieout = 600;
  12. private $session_lifespan =3600;
  13.  
  14. public function __construct() {
  15. $objDB= new Datebase();
  16. //$dbhandle=$objDB->connect();
  17.  
  18. array(&$this, '_session_open_method'),
  19. array(&$this, '_session_close_method'),
  20. array(&$this, '_session_read_method'),
  21. array(&$this, '_session_write_method'),
  22. array(&$this, '_session_destroy_method'),
  23. array(&$this, '_session_gc_method')
  24. );
  25.  
  26. $strUserAgent = $GLOBALS["HTTP_USER_AGENT"];
  27. if ($_COOKIE["PHPSESSID"]){
  28. $this->php_sesion_id=$_COOKIE["PHPSESSID"];
  29. $sql = "SELECT session_id FROM session_user
  30. WHERE session_id_ascci = '" . $this->php_session_id .
  31. "' AND ((now() - session_when_start) < ' " . $this->session_lifespan . " seconds')
  32. AND session_user_agent='" . $strUserAgent . "'
  33. AND ((now() - session_last_impress) <= '".$this->session_timeout." seconds'
  34. OR session_last_impress IS NULL)";
  35.  
  36. $result=$objDB->select($sql);
  37. if($objDB->dbNumRows==0) {
  38. $failed =0;
  39. $sql ="DELETE FROM session_user
  40. WHERE (session_id_ascci = '". $this->php_session_id . "')
  41. OR (now() - session_when_start) > $maxlifetime)";
  42. $result =$objDB->delete($sql);
  43.  
  44. $sql="DELETE FROM session_user
  45. WHERE session_id
  46. NOT IN (SELECT session_id FROM session_user)";
  47. $result=$objDB->delete($sql);
  48. unset($_COOKIE["PHPSESSID"]);
  49. };
  50. };
  51. session_set_cookie_params($this->session_lifespan);
  52. return $objDB;
  53. }
  54.  
  55. public function Impress() {
  56. if ($this->native_session_id) {
  57. $sql="UPDATE session_user
  58. SET session_last_impress = now()
  59. WHERE session_id = " . $this->native_session_id;
  60. $result = $objDB->update($sql);
  61. }
  62. }
  63.  
  64. public function IsLoggedIn() {
  65. return($this->logged_in);
  66. }
  67.  
  68. public function GetUserID(){
  69. if ($this->logged_in){
  70. return($this->user_id);
  71. } else {
  72. return(false);
  73. }
  74. }
  75.  
  76. /*public function GetUserObject() {
  77.   if($this->logged_in){
  78.   if (class_exists("User")) {
  79.   $objUser = new User($this->user_id);
  80.   return($objUser);
  81.   } else {
  82.   return(false);
  83.   }
  84.   }
  85.   }*/
  86.  
  87. public function GetSessionIndentifier() {
  88. return($this->php_sesion_id);
  89. }
  90.  
  91. public function Login($strUsername, $strUserPassword){
  92. $strUserPasswordSHA1= sha1($strUserPassword);
  93. $sql="SELECT user_id FROM user
  94. WHERE user_name = '$strUsername'
  95. AND user_password = '$strUserPasswordSHA1'";
  96.  
  97. $row=$objDB->select($sql);
  98. if ($objDB->dbNumRows>0) {
  99. $this->user_id=$row['session_user_id'];
  100. $this->logged_in =true;
  101. $sql="UPDATE session_user
  102. SET session_logged = true, session_user_id = " . $this->user_id . "
  103. WHERE session_id = " . $this->native_session_id;
  104. $objDB->update($sql);
  105. return(true);
  106. } else {
  107. return(false);
  108. }
  109. }
  110.  
  111. public function LogOut() {
  112. if ($this->logged_in== true) {
  113. $sql="UPDATE session_user
  114. SET session_logged = false, session_user_id = 0
  115. WHERE session_id = " . $this->native_session_id;
  116. $objDB->update();
  117. $this->logged_in=false;
  118. $this->user_id=0;
  119. return(true);
  120. } else {
  121. return(false);
  122. }
  123. }
  124.  
  125. public function _get($nm) {
  126. $sql="SELECT wartosc_zmiennej
  127. FROM zmienna_sesji
  128. WHERE identyfikator_sesji = " . $this->native_session_id . "
  129. AND nazwa_zmiennej = '" . $nm . "'";
  130. $row=$objDB->select($sql);
  131. if ($objDB->dbNumRows>0) {
  132. returnunserialize($row["wartosc_zmiennej"]);
  133. } else {
  134. return(false);
  135. }
  136. }
  137.  
  138. public function _set($nm, $val) {
  139. $strSer = serialize($val);
  140. $sql="INSERT INTO zmienna_sesji(identyfikator_sesji, nazwa_zmiennej, wartosc_zmiennej)
  141. VALUES(" . $this->native_session_id . ", '$nm', '$strSer')";
  142. $objDB->insert($sql);
  143.  
  144. }
  145.  
  146. private function _session_open_method($save_path, $session_name){
  147. return(true);
  148. }
  149.  
  150. private function _session_close_method() {
  151. //mysql_close($this->dbhandle);
  152. return(true);
  153. }
  154.  
  155. private function _session_read_method($id) {
  156. $strUserAgent= $GLOBALS["HTTP_USER_AGENT"];
  157. $this->php_session_id = $id;
  158. $failed=1;
  159. $sql="SELECT *
  160. FROM session_user
  161. WHERE session_id_ascii = '$id'";
  162. $row=Datebase::select($sql);
  163. if ($objDB->dbNumRows>0) {
  164. $this->native_session_id = $row['session_id'];
  165. if ($row['session_logged']=="t") {
  166. $this->logged_in=true;
  167. $this->user_id = $row["session_user_id"];
  168. } else {
  169. $this->logged_in = false;
  170. }
  171. } else {
  172. $this->logged_in = false;
  173. $sql="INSERT INTO session_user(session_user_ascii, session_logged, session_user_id, session_when_start, session_user_agent)
  174. VALUES ('$id','f',0,now(),'$strUserAgent')";
  175. $objDB->insert($sql);
  176.  
  177. $sql="SELECT session_id from \"session_user\"
  178. WHERE session_id_ascii = '$id'";
  179. $row=Datebase::select($sql);
  180. $this->native_session_id = $row["session_id"];
  181.  
  182. }
  183. return("");
  184. }
  185.  
  186. private function _session_write_method($id, $sess_data) {
  187. return(true);
  188. }
  189.  
  190. private function _session_destroy_method($id) {
  191. $sql="DELETE FROM session_user
  192. WHERE session_id_ascii = '$id'";
  193. $result=Datebase::delete($sql);
  194. return($result);
  195. }
  196.  
  197. private function _session_gc_method($maxlifetime) {
  198. return(true);
  199. }
  200. }
  201.  
  202.  
  203. ?>
PotasK
Stworzyłeś obiekt w konstruktorze, więc ma on zasięg jedynie wewnątrz konstruktora. Musisz stworzyć w klasie zmienną, do której będziesz go przypisywał, żeby móc odwoływać się do niego w dowolnej funkcji w klasie.

Dodajesz więc, np. w linii 13.:
  1. private $objDB = NULL;

A pierwszą linię z konstruktora (15.) zamieniasz na:
  1. $this->objDB = new Database();

No i oczywiście wszystkie odwołania do $objDB zmieniasz na $this->objDB.

Database::select() działa, ponieważ jest to metoda statyczna, więc nie wymaga utworzenia instancji klasy Database.

Swoją drogą, co to za książka, w której dają przykłady klas, nie tłumacząc sposobu ich funkcjonowania?

Manual: http://php.net/manual/en/language.oop5.php
bastard13
Jak użyjesz http://translate.google.pl/ to większość z tych błędów będzie dla Ciebie zrozumiała. Angielski to podstawa, jeżeli chcesz być programistą, więc im szybciej sam zaczniesz walczyć z takimi prostymi rzeczami (gdzie rozwiązanie wynika bezpośrednio ze zdania), to naprawdę zaprocentuje na przyszłość. Tym bardziej, że po pewnym czasie do takich błędów się przyzwyczaisz, bo przynajmniej na początkach często się powtarzająsmile.gif
brzoza91
Cytat(PotasK @ 12.05.2012, 19:46:17 ) *
Stworzyłeś obiekt w konstruktorze, więc ma on zasięg jedynie wewnątrz konstruktora. Musisz stworzyć w klasie zmienną, do której będziesz go przypisywał, żeby móc odwoływać się do niego w dowolnej funkcji w klasie.


a załóżmy, że mamy taka funkcję, w jaki sposób np w innym pliku przypisać do zmiennej $wynik zawartość tablicy zwracanej przez funkcję(ta funkcja jest składową klasy)?
w tym przypadku, zwracana jest tablica $row i ja ją teraz przypisać do zmiennej $tablica


  1. public function getMessages(){
  2. $limit=40;
  3. try{
  4. $stmt=$this->hConn->query('SELECT * FROM messages');
  5. $stmt->setFetchMode(PDO::FETCH_ASSOC);
  6.  
  7. while($row = $stmt -> fetch()){}
  8. $stmt->closeCursor();
  9.  
  10. return $row;
  11. }
  12. catch(PDOException $e){
  13. echo "wystapil blad" . $e->getMessage();
  14. }
  15. }
PotasK
Yyy, nie wiem, czy do końca zrozumiałem, ale:

  1. $obiekt = new NazwaKlasy();
  2. $wynik = $obiekt->getMessages();


Jeśli jednak chcesz przypisać do zmiennej $wynik w innej klasie to kolejno:

Zmianna $wynik z dostępem publicznym:
  1. $obiekt2 = new NazwaKlasy2();
  2. $opiekt2->wynik = $obiekt->getMessages();


Zmienna $wynik statyczna, z dostępem publicznym:
  1. NazwaKlasy2::$wynik = $obiekt->getMessages();


A w przypadku zmiennej $wynik z dostępem prywatnym lub chronionym, trzeba w klasie utworzyć metodę:
  1. public function setWynik($value)
  2. {
  3. $this->wynik = $value;
  4. }

I wywołać:
  1. $obiekt2 = new NazwaKlasy2();
  2. $obiekt2->setWynik($obiekt->getMessages());


Jeśli chodziło Ci o coś innego, to proszę, sprecyzuj.
brzoza91
chodzi mi o to

  1. $obiekt = new NazwaKlasy();
  2. $wynik = $obiekt->getMessages();



lecz, gdy wyświetlę potem $wynik np. tak :
  1. print_r($wynik);

to nic się nie wyświetla, a powinna być wyświetlona tablica z wiadomościami które zostają zwrócone z funkcji.
PotasK
A wyeliminowałeś wszystkie błędy? Jeśli tak, to spróbuj na początku skryptu jeszcze dodać:
  1. error_reporting(E_ALL | E_STRICT);

Zamień też print_r() na var_dump() i podaj co Ci się wyświetla.
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.