Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wykorzystanie klasy w innej klasie
Forum PHP.pl > Forum > PHP
tiraeth
Witam... aktualnie pracuję nad systemem CMS i natknąłem się na problem związany z wykorzystaniem klasy obsługującej bazy danych (mysql, pgsql etc.).

Do zarządzania sesjami wykorzystuję session_handlera, który korzysta z bazy danych i niestety nie mogę poradzić sobie z wykorzystaniem klasy sql_layer w klasie session.

Próbowałem to robić tak:
  1. <?php
  2. # .....
  3. class session
  4. {
  5.  $db = new sql_layer;
  6.  $db->sql_connect($host, $user, $password, $database);
  7. # .....
  8. # pozniej wykonuje zapytanie w ten sposob
  9.  $db->sql_query(&#092;"ZAPYTANIE SQL\");
  10. # .....
  11. }
  12. # .....
  13. ?>

I niestety ten sposób nie działa.... proszę o pomoc!
czachor
Tzn. jak nie działa? Jakiś błąd?
Możesz utworzyć obiekt sqgl_layer? Masz dołączony plik z klasą?
tiraeth
Udało mi się rozwiązać problem - wystarczyło utworzyć funkcję o takiej samej nazwie jak klasa i w niej wykonać $this->db = new sql_layer i $this->db->sql_connect() smile.gif

Teraz wywala mi taki błąd po zalogowanu się:

Cytat
Powtórzone wyst?pienie '80d17544091424d4db43d6da40f48c59' dla klucza 1
Warning: Unknown: A session is active. You cannot change the session module's ini settings at this time. in Unknown on line 0


  1. <?
  2. # tworzymy nowy obiekt klasy
  3. $ses_class = new session($config['host'], $config['user'], $config['password'], $config['database'], SESSIONS_TABLE); 
  4.  
  5. # podmieniamy funkcje sesji php aby mozna bylo uzywac klasy
  6. session_set_save_handler (array(&$ses_class, '_open'), 
  7. array(&$ses_class, '_close'), 
  8. array(&$ses_class, '_read'), 
  9. array(&$ses_class, '_write'), 
  10. array(&$ses_class, '_destroy'), 
  11. array(&$ses_class, '_gc')); 
  12.  
  13. # startujemy sesje
  14.  
  15. class session
  16. {
  17.  function session($host, $user, $password, $database, $table)
  18.  {
  19. $this->db = new sql_layer;
  20. $this->db->sql_connect($host, $user, $password, $database) or die(mysql_error());
  21. $this->ses_table = $table;
  22.  }
  23.  
  24.  function _open($path, $name)
  25.  { 
  26. return TRUE; 
  27.  } 
  28.  
  29.  function _close()
  30.  { 
  31. $this->_gc(0); 
  32. return TRUE; 
  33.  } 
  34.  
  35.  function _read($ses_id)
  36.  { 
  37. $session_sql = &#092;"SELECT * FROM \" . $this->ses_table . \" WHERE session_id = '\".$ses_id.\"' LIMIT 1\";
  38. $session_res = $this->db->sql_query($session_sql); 
  39. if (!$session_res)
  40. { 
  41.  return ''; 
  42. } 
  43.  
  44. $session_num = $this->db->sql_numrows($session_res); 
  45. if ($session_num > 0)
  46. { 
  47.  $session_row = $this->db->fetch_result($session_res); 
  48.  $ses_data = $session_row['session_value']; 
  49.  return $ses_data; 
  50. }
  51. else
  52. { 
  53.  return ''; 
  54. } 
  55.  } 
  56.  
  57.  function _write($ses_id, $data)
  58.  { 
  59. $session_sql = &#092;"UPDATE \" . $this->ses_table . \" SET session_time='\" . time() . \"', session_value='$data' WHERE session_id='\".$ses_id.\"'\"; 
  60. $session_res = $this->db->sql_query($session_sql); 
  61. if (!$session_res)
  62. { 
  63.  return FALSE; 
  64. } 
  65. if ($this->db->sql_affected_rows)
  66. { 
  67.  return TRUE; 
  68. } 
  69.  
  70. $session_sql = &#092;"INSERT INTO \" . $this->ses_table . \" (session_id, session_time, session_start, session_value)\" . \" VALUES ('$ses_id', '\" . time() . \"', '\" . time() . \"', '$data')\"; 
  71. $session_res = $this->db->sql_query($session_sql); 
  72. if (!$session_res)
  73. {
  74.  return FALSE; 
  75. }
  76. else
  77. { 
  78.  return TRUE; 
  79. } 
  80.  } 
  81.  
  82.  function _destroy($ses_id)
  83.  { 
  84. $session_sql = &#092;"DELETE FROM \" . $this->ses_table . \" WHERE session_id = '$ses_id'\"; 
  85. $session_res = $this->db->sql_query($session_sql); 
  86. if (!$session_res)
  87. { 
  88.  return FALSE; 
  89. }
  90. else
  91. { 
  92.  return TRUE; 
  93. } 
  94.  } 
  95.  
  96.  function _gc($life)
  97.  { 
  98. $ses_life = strtotime(&#092;"-15 minutes\"); 
  99.  
  100. $session_sql = &#092;"DELETE FROM \" . $this->ses_table . \" WHERE session_time < $ses_life\"; 
  101. $session_res = $this->db->sql_query($session_sql); 
  102.  
  103.  
  104. if (!$session_res)
  105. { 
  106.  return FALSE; 
  107. }
  108. else
  109. { 
  110.  return TRUE; 
  111. } 
  112.  } 
  113. } 
  114. ?>


Odrazu podaję kod tej klasy smile.gif
dr_bonzo
1.
Cytat
wystarczyło utworzyć funkcję o takiej samej nazwie jak klasa

To sie nazywa konstruktor
2. uzywasz ktorejsc z funkcji session_*?
3. masz session.auto_start = On?
tiraeth
Dobra rozwiązałem problem smile.gif W funkcji _write odwołuję się do funkcji sql_affected_rows smile.gif Pisałem bez () przez co uznawał to za zmienną i nie chciał kontynuować sesji smile.gif

Dziękuję za zainteresowanie tematem!
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.