Странное поведение сессий

u4n

Новичок
Странное поведение сессий

Есть такой класс.

PHP:
class Session {

	public function __construct($sessionId = "") {
		if (!empty($sessionId)) {
			session_id($sessionId);
		}

		if (session_id() == "") {
			session_start();
		}
	}

	public function setParameter($name, $value) {
	    if (is_string($value)) {
		    $_SESSION[$name] = trim(strip_tags($value));
	    } else {
		    $_SESSION[$name] = $value;
		}
	}

	public function getParameter($name) {
		if (isset($_SESSION[$name])) {
			return $_SESSION[$name];
		}

		return;
	}

    ...
}
и есть такой класс:
PHP:
abstract class ItemMapper ... {

    protected
                        $maxElements,
			$viewElements,
			$storeVariable;
    ...

    protected function getNextFirstElement() {
    	$session = new Session();

    	$firstElement = (int)$session->getParameter($this->storeVariable);

    	if (empty($firstElement) ||
    		$firstElement > ($this->maxElements - $this->viewElements)) {
    		$firstElement = 0;
    	}

    	$session->setParameter($this->storeVariable, $firstElement + 1);

		return $firstElement;
    }
}
Далее в дочернем классе PromoBookMapper класса ItemMapper реализуется такой метод:

PHP:
class PromoBookMapper extends ItemMapper {

	public function __construct(...) {
                ...

                $this->maxElements = 8;
		$this->viewElements = 4;
		$this->storeVariable = "element";
        }

    public function findList($section) {
    ...
        $test = $this->getFindListString($section);
    ...
    }

    protected function getFindListString($section) {
    ...
        $test = $this->getNextFirstElement();
    ...
    }
}
В сессию записывается правильное значение, т.е. сначала из метода getNextFirstElement() класса PromoBookMapper возвращается 0, а в сессию пишется $_SESSION['element'] = 1; Но если нажимаю F5, то из сессии в переменную $firstElement записывается значение 2 (вместо ожидаемой 1) и возвращается из метода. Соответственно в сессию уже пишется 3, вместо ожидаемых 2.

Если запускаю скриптец, а потом дописываю такое условие else
PHP:
    	if (empty($firstElement) || $firstElement > ($this->maxElements - $this->viewElements)) {
    		$firstElement = 0;
    	} else {
                print $firstElement;
                exit;
        }
нажимаю F5, то выводится 1 (что правильно), все останавливается и все зашибись. Если exit не ставить, т.е. продолжить нормальное выполнение, то выводится 2.

Я понимаю, что где-то я налопатил чего-то не того. Но я уже 2 дня с этой херью бьюсь. Причем буквально 2 дня назад все работало как часы. Никаких изменений с этими классами не производилось. Метод вызывается один раз. Но проблема есть и отловить ее у меня не получается. Может кто-то ткнет носом, в каком направлении копать и где я накосячил? Или хотя бы как грамотно все это дело подебажить?

Версия PHP 5.2.10, Apache 1.3.34 (win)
 

alexv

Новичок
два дня это как-то много

у вас точно по окончании скрипта $_SESSION['element'] = 1 ?
 

u4n

Новичок
alexv
если ставить exit после print $firstElement; то да. выводит 1, если не ставить и дать скрипту полностью отработать, то выводит 2.

я как пробовал: print_r($_SESSION); сразу после старта сессии - естественно показывает пустой array (), в Session::setParameter() print_r($_SESSION) после записи в массив показывает array("element" => 1) - что тоже логично и правильно.

а вот когда нажимаю F5, то первый print_r($_SESSION) (который сразу после старта сессии) уже показывает array("element" => 2);

я осознаю, что это мой косяк. что не могут сессии так загоняться. но отловить баг, тоже пока не получается :(

-~{}~ 15.09.09 18:47:

2 фанат

еще раз и поподробнее, пожалуйста. если можно
 

u4n

Новичок
спасибо за советы. буду внимать :)

сегодня еще плотно засяду...

-~{}~ 18.09.09 10:44:

собственно дело действительно оказалось в недостающих картинках. век живи - век учись. еще раз спасибо за наводку. тему можно смело закрывать.
 

Фанат

oncle terrible
Команда форума
дело оказалось в кривом чпу.
а не в недостающих картинках

красивые урлы хотят все, а нужной прямизной рук для этого обладают немногие.
 

u4n

Новичок
мимо, фанат, мимо :)
в любом случае, ты дал верное направление. и я еще раз говорю тебе спасибо.
 
Сверху