Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Zgubiona sesja.
Forum PHP.pl > Forum > PHP
kamilos809
Hejka
Problem ma się tak: Mam stronkę opartą na sesji. Sesja zwykła, przechowuje login i hasło.
Kiedy się spotka z tym kodem:
  1. $sql = "INSERT INTO posty VALUES (NULL, '$tresc', '$user', '$rodzic', '$temat')";
  2. $result = mysql_query($sql);
  3. if($result) echo'<a href="temat.php?temat='.$_POST['temat'].'">Powrót</a>';


sesję szlag trafia i trzeba ją tworzyć od nowa :/
gitbejbe
zawsze na początku KAŻDEGO dokumentu : session_start();
freemp3
Cytat
zawsze na początku KAŻDEGO dokumentu : session_start();

Nie do końca. Sesjia powinna być uruchomiona tylko raz, ponieważ aplikacja później sypie informacjami o ponownym starcie sesji. Jeśli masz jakiś globalny plik, który jest ładowany za każdym razem to do niego powinieneś wrzucić start sesji.

jackraymund
Niemozna tak? Mam klase i nie w kazdej funkcji potrzebuje sesji, w konstruktorze tez troche niezbyt bo mam funkcje statyczne jak islogged.
Wiec session_start uzywam moze z kilka razy przy wczytaniu strony.
Zawsze pod koniec funkcji koncze sesje funkcja session_write_close()

Jest to zle? Wszystko dziala poprawnie.
nospor
Cytat
Mam klase i nie w kazdej funkcji potrzebuje sesji
Super.... ale jak juz raz wystarowales sesje to ciagle jej zamykanie i startowanie jest totalnie bez sensu.
freemp3
Owszem będzie to działać poprawnie, nie powiedziałem, że nie. Sesja jest przecież dostępna w globalnej tablicy, więc dlaczego nie uruchomić jej raz i mieć święty spokój? Każde takie uruchomienie to tylko strata czasu. Może i nie za wiele, ale przy dużym ruchu na stronie może to powodować zbędne obciążenie i wydłużyć czas ładowania.
jackraymund
Czyli jezeli zamienię funkcje statyczna na zwykłą, w konstruktorze dam start a w destruktorze end to sesja bedzie dzialac na calym obiekcie?
freemp3
Czyli jeżeli w gdziekolwiek w kodzie wywołasz start sesji to do tego momentu zmienna $_SESSION jest uzupełniana i jest dostępna w każdym miejscu w kodzie. Nie ważne czy jest to funkcja, metoda zwykła czy statyczna, konstruktor czy destruktor, jest to zmienna globalna. Zachowuje się identycznie jak zmienne $_GET oraz $_POST. Z tym wyjątkiem że one są dostępne od razu, a sesje najpierw trzeba uruchomić ręcznie. Chociaż i to nie do końca jest prawdą, bo można w konfiguracji ustawić automatyczny start sesji.
kamilos809
Widzę chłopaki się rozgadali a problem jak był tak jest....
Oczywiście mam plik globalny (trzymam tam połączenie z bazą, ważne funkcje itp.) i oczywiście mam tam session_start(); na samym początku pliku biggrin.gif
freemp3
W takim razie pozostaje sprawdzić do którego momentu sesja istnieje. W kodzie który podałeś nie ma nic o sesji. Sprawdź jak wygląda zmienna $_SESSION bezpośrednio przed nim oraz za nim. Jeśli już przed nim będzie nie tak pozostaje się cofać i sprawdzać jak wygląda zmienna kilka linijek wcześniej.
kamilos809
cały pliczek wygląda tak:
  1. <?php include "antet.php"; include "func.php";
  2. $user=$_SESSION["user"][0];
  3. $tresc=$_POST["odpowiedz"];
  4. $temat=$_POST["temat"];
  5. $sql = "INSERT INTO forum_posty VALUES (NULL, '$tresc', '$user', '$rodzic', '$temat')";
  6. $result = mysql_query($sql, $db_id);
  7. if($result) echo'<a href="temat.php?temat='.$_POST['temat'].'">Powrót</a>';
  8. ?>

jak widać kod wiele się nie zmienia, a po cofnięciu z niego do drugiego pliku wywala sesję całkowicie :/
nospor
no a temat.php startuje sesje?
kamilos809
Jasne smile.gif
w nim też jest includowany plik globalny, bo niestety musi...
freemp3
Jak rozumiem w momencie dodawania wpisy do bazy danych sesja jest jeszcze poprawna?
Może w pliku temat.php masz gdzieś resetowanie sesji i wkradła się literówka lub coś takiego? Więcej nie poradze bo nie wiem co znajduje się w pliku.
Możesz spróbować śledzić sesje od momentu jej wystartowania, np wyświetlając co kilka linijek i tym sposobem sprawdzisz gdzie dokładnie leży błąd.
jackraymund
Taki samy problem miałem, dlatego przed każdą funkcją startowałem sesje.
Ale z teori kolegi który mi odpowiedział na pytanie, to nie powinno mieć miejsca, a jednak mamy razem podobny problem.


Spróbowałem aby dać start session w konstruktorze jednak to nic nie dało, obiekt nie trzyma otwartej sesji.
czyli tak na szybko przedstawienie jak to wygląda
klasa.php
  1. class klasa{
  2. public function __constructor(){
  3. $_SESSION['foo'] = "bar";
  4. }
  5.  
  6. public function rysuj(){
  7. var_dump($_SESSION);
  8. }
  9. }

index.php
  1. include "klasa.php";
  2. $obiekt = new klasa;
  3. $obiekt->rysuj();


var_dump pokazuje pusty string, lecz gdy dam session_start(); przed uzyciem $_SESSION wtedy działa jak należy.
nospor
Cytat
var_dump pokazuje pusty string, lecz gdy dam session_start(); przed uzyciem $_SESSION wtedy działa jak należy.
No bo jak nigdzie wczesniej nie startowales sesji to niby jakim cudem ci mialo zadzialac?
freemp3
@jackraymund nie __constructor() tylko __construct(). Z poprawną nazwą konstruktora śmiga aż miło.
kamilos809
z startowaniem sesji kombinowałem już w różnych kombinacjach. Jak wyrzucało, tak nadal wyrzuca :/
jackraymund
@freemp3

@nospor
Jak nie? W kontruktorze wystartowałem sesje.

freemp3 pisał że jeżeli gdzieś wystartuje sesje to reszta kodu będzie łapać ją, a nie łapie.

To co mogę jeszcze zrobić? autosession wolałbym zostawić, bo niechce włączać sesji dla każdej podstrony


@up
a wyrzuca ci jakiś błąd? podaj treść błędu

@down
2 raz powtórze to co napisałem

""czyli tak na szybko przedstawienie jak to wygląda" wiadome że odręcznie jakiś syntax mógł wpaść."
kod pisałem odręcznie i go nie uruchamiałem, ale identycznie wygląda sprawa na serwerze. Tylko że jest poprawnie bez syntaxów a konstruktor działa
freemp3
kamilos809 spróbuj wystartować sesję w każdym z tych plików, na początku. Jeśli to nic nie da to spróuj ją wystartować także bezpośrednio przed linijką w której się wywala. Jeśli nadal będzie pusta to znaczy, że gdzieś jest czyszczona.

@jackraymund w konstruktorze nie wystartowałeś sesji bo był błąd w jego nazwie więc nie ma bata, żeby zadziałało. Napisałem Ci, że po poprawieniu jego nazwy wszystko działa jak należy. Czytaj ze zrozumieniem.
Po drugie to nie jest temat o tym gdzie i jak ładować sesje, tylko problem @kamilos809. Jeśli chcesz dalej ciągnąć temat to dobrze by było założyć oddzielny wątek bo tylko patrzeć jak jakiś mod sie zdenerwuje i polecą ostrzeżenia.

kamilos809
Błędu jako takiego nie ma. Każdy to błąd includowania przez to, że nie może zaincludować pustego pliku, bo nazwę jego wyczytuje się dzięki userowi.

No ale jak już pokazać to pokazać.

  1. Warning: include(www\devana\language) [function.include]: failed to open stream: Permission denied in D:\Programy\VertrigoServ\www\devana\antet.php on line 3


  1. Warning: include() [function.include]: Failed opening 'language/' for inclusion (include_path='.;D:\Programy\VertrigoServ\Smarty') in www\devana\antet.php on line 3


  1. Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in D:\Programy\VertrigoServ\www\devana\func.php on line 409



jackraymund
nadaj prawa anet.php najlepiej 0777, używaj require zamiast include, dla plików które stale chcesz przytwierdzić, i są niezbędne.

mysql_row popraw tą linie aby niezbędnie
freemp3
Nadanie takich praw nic nie da, a wręcz zaszkodzi, ponieważ w tedy plik będzie mógł być nadpisany przez dowolnego użytkownika.
Błędy nie są spowodowane brakiem uprawnień, ale brakiem pliku. Może przed include sprawdzaj czy plik istnieje i czy nie jest on katalogiem. W razie zwrócenia false ładuj domyślny plik językowy.
Co do mysql_fetch_row to zapewne jest błąd połączenia z bazą danych i do zmiennej w której przechowywany jesy uchwyt trafia false. Sprawdź czy połączenie się powiodło i dopiero wykonuj mysql_fetch_row.
kamilos809
Aj chłopaki nie rozumiecie biggrin.gif
Ten plik normalnie działa tylko ja trochę nakombinowałem tongue.gif
bo to jest formularz w pliku 1 -> wysyłanie w pliku 2 -> powrót do pliku 1

i przy powrocie nagle gubi sesje której nie może gubić bo wyloguje użytkownika..
freemp3
Ok. Sprawdziłeś czy po powrocie zaraz po wystartowaniu sesji jest ona poprawna?
kamilos809
a jak to sprawdzić?
Bo sesjami bawię się pierwszy raz
freemp3
Tak jak każdą inną zmienną:
  1. var_dump($_SESSION);

kamilos809
I tyle mi to zmieniło co nic. Wiem to co wiedziałem i wam tłumaczyłem biggrin.gif

plik z zapytaniem:
  1. 'user' => &
  2. 0 => string '1' (length=1)
  3. 1 => string 'edziu' (length=5)
  4. 2 => string '77316262ab419c32c8c38e6513eb9e5c' (length=32)
  5. 3 => string 'kamilos809@interia.pl' (length=21)
  6. 4 => string '5' (length=1)
  7. 5 => string '2013-08-07' (length=10)
  8. 6 => string '2013-08-24 10:18:32' (length=19)
  9. 7 => string '0' (length=1)
  10. 8 => string '127.0.0.1' (length=9)
  11. 9 => string 'Opisik' (length=13)
  12. 10 => string '1' (length=1)
  13. 11 => string '1' (length=1)
  14. 12 => null
  15. 13 => string 'default/' (length=8)
  16. 14 => string 'Założyciel' (length=10)
  17. 15 => string '0' (length=1)
  18. 16 => string 'pl.php' (length=6)



a po powrocie do pliku z formularzem:

  1. 'user' => &string '1' (length=1)


Dobra, problem w połowie rozwiązany.
JAk zgrałem te pliki w jeden to błąd się nie pokazuje, ale jak odświeżę to znów gubi sesję. Jakieś pomysły?
freemp3
Czy dobrze widze, że w sesji trzymasz referencje do tablicy? To nie ma prawa zadziałać. Umieść w sesji tablicę a nie referencje do niej.
kamilos809
Ale w innych plikach działa ;D
Przyznam się, że to jest system niepisany przeze mnie i próbuję dorobić tam swoje pliki, które są mi niezbędne...

-------------------------------------------------------------------------------------
Poradziłem sobie już smile.gif
Zapytanie skopiowałem do pliku funkcyjnego, formularz przekierowałem na tą funkcje i działa jak marzenie wink.gif

TEMAT DO ZAMKNIĘCIA smile.gif
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.