Skocz do zawartości

[php] Nietypowe zachowanie przy wykorzystaniu obie


grager

Rekomendowane odpowiedzi

Otóż.. napisałem dość prosty i prymitywny skrypt logowania uzytkownikow oparty na klasie, skrypt ten bez problemu uruchomilem na wlasnym komputerze, gdzie PHP ma wersje 4.3.10. Wszystko chodzilo pieknie i gladko dopoki nie wstawilem tego na serwer internetowy. Wersja php serwera: 4.3.11. To samo na drugim serwerze, wersja 4.4.1 .

Problem przedstawia sie nastepujaco: po wejsciu na strone otrzymujemy formularz logowania, ktory po poprawnym zalogowaniu przenosi nas na strone panelu. O dziwo, sesja ['user'] zawierajaca id, login i haslo nie powstaje, ale to mozemy jej wybaczyc. Po przejsciu do innej podstrony, obojetnie jakiej, albo chociazby odswiezeniu, sesja powstaje, o dziwo poprawnie. Ale juz po nastepnym odswiezeniu/przejsciu, sesja ['user'] staje sie, lub raczej zaczyna przechowywac obiekt (!), a poniewaz skypt nie znajduje danych uzytkownika, przeniesieni zostajemy do strony logowania.

Po wypisaniu var_dump otrzymujemy:

array(1) { ["user"]=> &object(__PHP_Incomplete_Class)(4) { ["__PHP_Incomplete_Class_Name"]=> string(5) "users" ["user_id"]=> string(1) "1" ["user_password"]=> string(32) "e6a52c828d56b46129fbf85c4cd164b3" ["user_login"]=> string(5) "admin" } }

Po ponownym zalogowaniu wprawdzie ponownie przenosimy sie na strone panelu ale nie wyswietlana jest ona, gdyz pojawia sie blad:

Fatal error: Call to a member function on a non-object in /home/tips/domains/tips.nuh.pl/public_html/admin/index.php on line 17

W tym momencie sesja dalej przechowuje obiekt, a zmienna ktora przedtem ten obiekt (przy 1 logowaniu) poprawnie przechowywala, nagle staje sie tablica, i dlatego ten ow blad.

Nastepnie podaje zrodlo skryptow:

config/users.php (wszystkie "echo" sa tu dlatego, ze sam, potem takze inny programista, badalismy dosc dlugo ta sprawe)

<?php

var_dump($_SESSION).'<br>';

class Users

{

  var $user_id;

  var $user_password;

  var $user_login;

 

 

  function Users(){

    if(!empty($_SESSION['user']['id']) || !empty($_SESSION['user']['password']) || !empty($_SESSION['user']['login']) ){

    echo 'jestes zalogowany<br>';

    echo 'twoje dane: '.$_SESSION['user']['id'].' '.$_SESSION['user']['password'].' '.$_SESSION['user']['login'].'<br>';

   

     

      $w = mysql_query('SELECT COUNT(id) FROM admin_users WHERE id = "'.$_SESSION['user']['id'].'" AND login = "'.$_SESSION['user']['login'].'" AND password = "'.$_SESSION['user']['password'].'" ');

     

      list($count) = mysql_fetch_row($w);

     

      if($count!=1){

      echo 'unset';

     

      unset($_SESSION['user']);     

      }else{

     

      $this->user_id = $_SESSION['user']['id'];

      $this->user_password = $_SESSION['user']['password'];

          $this->user_login = $_SESSION['user']['login'];

      echo $this->user_id.' '.$this->user_password.' '.$this->user_login.'<br>';     

     

      $w = mysql_query("UPDATE admin_users SET loged = '".time()."' WHERE id = '".$this->user_id."' LIMIT 1");

     

      }

     

    }

   

  }

 

  function Logout($logout){

 

    if(!empty($logout)){

      echo 'loged out';

   

      unset($_SESSION['user']);

     

      $this->user_id = false;

      $this->user_login = false;

      $this->user_password = false;

     

      return true;

    }

   

  } 

  function Login_form(){

    if(empty($this->user_id) || empty($this->user_login) || empty($this->user_password) || !empty($_GET['logout']) ){

   

    ?>

   

    <center>

    <form method="POST" action="<?=$_SERVER['PHP_SELF'] ?>">

    <b>Zaloguj</b><br>

    Login:<input type="text" name="login"><br>

    Hasło:<input type="password" name="password"><br>

    <input type="submit" value="Zaloguj"></form>

    </center>

   

    <?php

    exit;

    return true;

    }

  return false;

  }

  function Login($login,$password){

  if(!empty($login) && !empty($password) && empty($this->user_id) && empty($this->user_login) && empty($this->user_password)){

 

    if(ereg('^[0-9a-zA-Z_]+$',$login) && ereg('^[0-9a-zA-Z_]+$',$password)){

    $password = md5($password);

    echo 'logujesz sie<br>';

     

      $w = mysql_query("SELECT COUNT(id),id FROM admin_users WHERE login = '".$login."' AND password = '".$password."' GROUP BY id");

      list($count,$id) = mysql_fetch_row($w);

     

      if($count != 1){

      echo '<center><strong>Wpisany login lub hasło sa niepoprawne.</strong></center><br />';

      return false;

      }

     

      echo 'login i haslo sa poprawne<br>';

      $this->user_id = $id;

      $this->user_password = $password;

      $this->user_login = $login;

     

      echo $this->user_id.' '.$this->user_password.' '.$this->user_login.'<br>';

   

    /* ponizszy sposob zapisu do sesji zasluguje na uwage, inny niz ten poprostu nie dzialal, $_SESSION['user']['id'] = $id zwracalo dziwny blad, jakoby zmienna $_SESSION nie byla tablica, i zapis do niej byl niemozliwy */ 

      $_SESSION['user'] = array(

      'id' => $id,

      'login' => $login,

      'password' => $password);

     

      echo $_SESSION['user']['id'].' '.$_SESSION['user']['password'].' '.$_SESSION['user']['login'].'<br>';

      var_dump($_SESSION,$this);

      echo '<br>Id sesji:'.session_id();

     

      return true;

     

    }

  }

  }

 

}

?>

index.php (sam poczatek, reszta jest zbedna)

<?php

include 'config/config.php';

#include 'config/manager.php';

include 'config/users.php';

$user = new Users();

$user->Logout($_GET['logout']);

echo $user;

$user->Login($_POST['login'], $_POST['password']);

echo $user;

$user->Login_form();

echo $user;

echo $user->user_id;

?>

Warto dodac, ze po tym drugim zalogowaniu, przy odswiezaniu podstrony po tym drugim zalogowaniu, strona raz to pojawia sie i bledu nie ma, a sesja zdaje sie przechowywac wszystko tak jak trzeba, to znow wyskakuje blad - tak na przemian.

Niektore rozwiazania w kodzie moga sie wydawac dosc.. bezsensowne, ale jest to kod po mozliwe jak najwiekszej ilosci uproszczen, etc., wszystko po to, aby moc wyeliminowac wszelkie bledy. Poniewaz nie tylko ja pracowalem nad tym kodem, w akcie desperacji zaczynam sadzic, iz znalazlem jakas nieokreslona lukę, bład w php.

Z gory dziekuje za wszelka pomoc.

Chcesz kupić Kolektory słoneczne. A może tylko poczytać o tych kolektorach. A najlepszym źródłem informacji będzie Blog Kolektorowy

Odnośnik do komentarza
Udostępnij na innych stronach

Nie bardzo mogę się zagłębić w ten kod, bo zupełnie inaczej zaznaczasz składnię niż ja. Nie widzę nigdzie w tym całym skrypcie session_start(), czy przypadkiem nie jest to konieczne do prawidłowego funkcjonowania skryptu? Być może na domowym serwerze masz session.auto_start = 1 i stąd te różnice. Pozdrawiam

Dała matka rozum? To kombinuj.

Odnośnik do komentarza
Udostępnij na innych stronach

Dokładnie, na początku każdego skryptu korzystającego z sesji musi być funkcja session_start() chyba, że serwer jest ustawiony tak jak napisał Hellz

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

session_start() ma byc wszedzie a nie w jednym pliku :D (no chyba ze wszedzie go ikludujesz. pamietaj aby byla na poczatku). i jak napisali poprzednicy, wiele z tego kodu nie wynika.

Odnośnik do komentarza
Udostępnij na innych stronach

czy zatem session_start powinno znajdowac sie w pliku w ktorym tworze klase, skoro przeciez i tak ten plik z klasa jest includowany razem z plikiem, ktory zawiera to session_start, a takze CO TO ZNACZY ZE WIELE Z NIEGO NIE WYNIKA

Chcesz kupić Kolektory słoneczne. A może tylko poczytać o tych kolektorach. A najlepszym źródłem informacji będzie Blog Kolektorowy

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności