Witam, mam problem nad którym spędziłem 1,5 dnia i nic mądrego nie wymyśliłem a bez jego rozwiązania nie jestem w stanie ruszyć dalej...

Piszę pewien projekt, który uwzględnia "przyjazne url" ale nie przy pomocy mod_rewrite lecz za pomocą zmiennej predefiniowanej $_SERVER['PATH_INFO']. Stosuję także własne oznaczenia dla parametrów url, np. dla kataegorii.

  1. <?php
  2. $_SERVER['PATH_INFO'] = (isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'] != '/') ? $_SERVER['PATH_INFO'] : '/';
  3. $url = explode('/', substr($_SERVER['PATH_INFO'], 1));
  4. ?>


Czyli upraszczając:
ADRES URL:
Link w postacji domena.pl/strona/podstrona/cat,100,name.html oznacza:

strona - plik strony (bez rozszerzenia - w .htaccess <Files index>ForceType application/x-httpd-php</Files> dzięki czemu rozpoznawany jest jako php)
podstrona - wymyślona nazwa podstrony, nie mająca fizycznego odpowiadnika w postaci pliku
cat,100,name.html - parametr kategorii url - gdzie cat - wskaznik typu parametru, 100 id kategorii, name - nazwa kategorii

Istnieje możliwość stosowanie kilku kategorii poprzez oddzielenie ";" - domena.pl/strona/podstrona/cat,100,name;cat,200,name2.html
Wszystkie dane dotyczące kategoii przechowywane są w tablicay $cats, np:
  1. <?php
  2. $urlCatsPart = explode('.', $url  [count($url )-1]); // odzielenie .html o wlasciwej czesci danych kategorii
  3. $catsPart = explode(';', $urlCatsPart [0]); //wydzielenie grup danych poszczegolnych kategorii
  4.  
  5. $cats= array( //wynik ostateczny po uzyciu kolejnego expolode dla ','
  6.    array(
  7.       'isValid' => true,
  8.       'catId' => 100,
  9.       'catName' => 'name'
  10.    ),
  11.    array(
  12.       'isValid' => true,
  13.       'catId' => 200,
  14.       'catName' => 'name1'
  15.    )
  16. );
  17. ?>

SESJA:
Do kontroli poprawności sesji stosuję zmienną $_SESSION['isValid'] ktora standardowo definiowana jest przez:
  1. <?php
  2. $_SESSION['isValid'] = (isset($_SESSION['isValid'])) ? $_SESSION['isValid'] : true;
  3. ?>

Natomiast funkcja sprawdzającą wartość poprzedniej zmiennej to:
  1. <?php
  2. function session() {
  3.       if(!$_SESSION['isValid'])
  4.       {
  5.              $sessionName = session_name();
  6.              if (isset($_COOKIE[$sessionName])) {
  7.                          setcookie($sessionName, '', time()-3600, '/');
  8.                 }
  9.        }
  10.        session_destroy();
  11.        echo '<meta http-equiv="refresh" content="0; url=index.php"/>';
  12. }
  13. ?>


FUNKCJA KONTROLI BLEDOW
Do kontroli bledow w calej aplikacji posiadam funckje error(), która zajmuje się międzyinnymi zmianą zmiennej kontroli sesji na false:
  1. <?php
  2. function error() { $_SESSION['isValid'] = false; }
  3. ?>


WERYFIKACJA POPRAWNOSCI LINKU
Jeśli zmienna $check = true, wtey jest aktywowana weryfikacja poprawności linku, którą wygląda np tak:
  1. <?php
  2. if($check == 1)
  3. {
  4. //sprawdzanie ilości kategorii (założmy makimum 2)
  5. if(count($catsPart) > 2)
  6. {
  7.     die(error());
  8. }
  9.      
  10. //sprawdzenie poprawnosci czesc url zawierajacej dane kategorii (sprawdzenie "koncowki" html oraz ilosci czesci powstalych z podzielenia przez znak "." powinno być 2 - czesc danych kategorii z url + . + html
  11. if(count(urlCatsPart ) != 2 || $urlCatsPart [1] != 'html')
  12. {
  13.     die(error());
  14. }
  15.  
  16. }
  17. ?>

Problem polega na jak gdyby somodzielnym wykonaniu instrukcji die().
Wpisanie adresu domena.pl/strona/cat,100,name.html lub bez kategorii domena.pl/strona/ i ponowne odswiezenie strony zmienia wartosc zmiennej $_SESSION['isValid'] na false, pomimo tego ze zaden z doch if-ow nie powinien byc wykonany, bo adres url i parametry kategorii sa ok. Nawet gy umiescimy w kazdym if-ie echo z jakim napisem, nie sotanie on wyswietlony bo ulr jest ok, a pomimo to funckja die zostaje wywolana.
I teraz czego wlasnie nie rozumiem zostaje wywolana tylko przez drugiego if-a (sprawdzenie poprawnosci czesc url) pierwszy if dziala ok. jesli nawet funkcje die w drugim if-ie wezme w komentarz i umieszcze echo, napis sie nie wyswietli a usuniecie komentarza spowoduje wykonanie if-a.

Jedynym rozwiazaniem jest usuniecie $_SESSION['isValid'] = false; z funckji error lub usuniecie die z drugiego if-a.

Systuacja ta nie ma miejsca dla linku w postaci domena.pl/strona a wpisanie domena.pl/strona/ lub domena.pl/strona/cat,100,name.html i odswiezenie strony wywoluje blad.

Oczywiscie wszystkie te funckje sa w maksylanym uproszczeniu, zey zaprezentowac istote problemu, bo nie moge zrozumiec dlaczego instrukcja if ktorej warunki nie sa spelnione wykonuje sie pomimo tego.

prosze o jakies wskazowki? pozdrawiam