Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Podwójna inkrementacja wartości zmiennej
Forum PHP.pl > Forum > Przedszkole
wnovak
Witam,

Mam pewien problem z obsługą sesji. Otóż po zalogowaniu użytkownika chciałbym liczyć ilość otwartych przez niego stron. Mam napisaną klasę do obsługi sesji. Wszystko generalnie działa ok, nie przeładowuje żadnych funkcji do obsługi sesji. Po prostu w konstruktorze klasy wywołuje session_start(); i pobieram odpowiednie zserializowane tablice, zapisuje je w zmiennej składowej. W destruktorze mam funkcję serializujacą i zapisującą w sesji dane z obiektu. Klasa jest singletonem więc nie można utworzyć więcej jak jednego obiektu. Więc jeśli mam tą zmienną i ją inkrementuje to zamiast o 1 jej wartość zwiększa się o 2. Co jest najzabawniejsze, jeśli w testowym skrypcie na serwerze, po prostu wywołałem session_start() to ta wartość zwiększała się o 1, mimo iż w samym skrypcie nigdzie się do niej nie odnosiłem.
Klasa, trochę uproszczona zostawiłem tylko istotne fragmenty kodu
  1. class UserSession {
  2. private function __construct() {
  3. $this->getSession();
  4.  
  5. $this->_arUserVars['prevPages']++;
  6.  
  7. if ($this->_arUserVars['prevPages'] > 15) {
  8. //chce wykonać jakąś akcję
  9. $this->_arUserVars['prevPages'] = 0;
  10. }
  11. }
  12. }
  13. public function __destruct() {
  14. $_SESSION['sUser'] = serialize($this->_arUserVars);
  15. }
  16. private function getSession() {
  17. $this->_arUserVars = unserialize($_SESSION['sUser']);
  18. }
  19. }


Jeśli po zainicjowaniu całej sesji tą klasą w innym pliku wpiszę session_start(); print_r($_SESSION); - to 'prevPages' zapisany w sesji będzie się inkrementował, dlaczego?

Ktoś wie o co chodzi??
Fifi209
Jakbyś pokazał więcej kodu...

Po pierwsze zawsze "zeruj" zmienne.
wnovak
Tylko co więcej? W żadnym innym miejscu na chwile obecną nie korzystam z tej zmiennej.

przy deklaracji tablicy mam $this->_arUserVars = array();

co ciekawe z testowania wczoraj. jak odpalam ten skrypt nie includujący w żaden sposób klasy, zresztą cały plik test.php to
  1. print_r($_SESSION);

to tak jak wczoraj napisałem po odświeżaniu zmienna się sama inkrementuje, natomiast co ciekawe jak wpisze do konstruktora swojej klasy die(); to nagle w tym skrypcie sesja ginie. nie rozumiem jak to jest połączone??

[EDIT]

znalazłem winowajcę :] ale nie mam pomysłu jak to naprawić jeszcze smile.gif

.htaccess

  1. RewriteEngine on
  2. RewriteBase /
  3.  
  4. RewriteCond %{REQUEST_FILENAME} !-f
  5. RewriteCond %{REQUEST_FILENAME} !-d
  6. RewriteRule ^images/avatar/([0-9]+)_([0-9]+)_x([0-9]+).(jpg|png)$ images/avatar/def_x$3.jpg [L]
  7.  
  8. RewriteCond %{REQUEST_FILENAME} !-f
  9. RewriteCond %{REQUEST_FILENAME} !-d
  10. RewriteRule ^(.+)?$ index.php [QSA,L]
  11.  


jeśli zakomentuję drugą regułę to wszystko z tą inkrementacją zaczyna działać dobrze, jak przerobić te reguły żeby wszystko dobrze działało??

Cały czas szukam rozwiązania, ale nie wiem czemu ta reguła wywołuje plik index.php dwa razy?? Sprawdziłem to już najprostszym skryptem poza budowaną przeze mnie aplikacją, przy odświeżeniu strony jej licznik zwiększa się dwa razy, nie tylko przy użyciu sesji, ale również gdy zapisuje go w pliku. W związku z tym wszystko wskazuje na tego .htaccessa Ma ktoś jakiś pomysł co tam jest źle?

[EDIT]

Chwilowo rozwiązałem to w taki sposób:
  1. RewriteRule ^[a-zA-Z0-9/]*$ index.php


jednak sposób jest taki trochę... jak ktoś wie jak to lepiej rozwiązać, to proszę o odpowiedź.

Chciałbym ponowić swoje pytanie, ponieważ dalej działam na tym rozwiązaniu tymczasowym.
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.