Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z wcześniej zdefiniowanym obiektem
brzoza91
post
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 4
Dołączył: 9.05.2012

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
PotasK
post
Post #2





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 25.04.2012

Ostrzeżenie: (0%)
-----


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

Ten post edytował PotasK 12.05.2012, 18:48:30
Go to the top of the page
+Quote Post
bastard13
post
Post #3





Grupa: Zarejestrowani
Postów: 664
Pomógł: 169
Dołączył: 8.01.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ą(IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
brzoza91
post
Post #4





Grupa: Zarejestrowani
Postów: 39
Pomógł: 4
Dołączył: 9.05.2012

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował brzoza91 20.05.2012, 17:37:28
Go to the top of the page
+Quote Post
PotasK
post
Post #5





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 25.04.2012

Ostrzeżenie: (0%)
-----


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.

Ten post edytował PotasK 21.05.2012, 09:59:00
Go to the top of the page
+Quote Post
brzoza91
post
Post #6





Grupa: Zarejestrowani
Postów: 39
Pomógł: 4
Dołączył: 9.05.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
PotasK
post
Post #7





Grupa: Zarejestrowani
Postów: 30
Pomógł: 1
Dołączył: 25.04.2012

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 00:09