kamilos809
22.08.2013, 23:30:26
Hejka
Problem ma się tak: Mam stronkę opartą na sesji. Sesja zwykła, przechowuje login i hasło.
Kiedy się spotka z tym kodem:
$sql = "INSERT INTO posty VALUES (NULL, '$tresc', '$user', '$rodzic', '$temat')";
if($result) echo'<a href="temat.php?temat='.$_POST['temat'].'">Powrót</a>';
sesję szlag trafia i trzeba ją tworzyć od nowa :/
gitbejbe
23.08.2013, 06:33:27
zawsze na początku KAŻDEGO dokumentu : session_start();
freemp3
23.08.2013, 07:52:43
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
23.08.2013, 08:42:52
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
23.08.2013, 08:50:18
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
23.08.2013, 08:54:18
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
23.08.2013, 09:21:58
Czyli jezeli zamienię funkcje statyczna na zwykłą, w konstruktorze dam start a w destruktorze end to sesja bedzie dzialac na calym obiekcie?
freemp3
23.08.2013, 09:28:47
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
23.08.2013, 11:08:39
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
freemp3
23.08.2013, 11:16:15
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
23.08.2013, 11:32:53
cały pliczek wygląda tak:
<?php include "antet.php"; include "func.php";
$user=$_SESSION["user"][0];
$tresc=$_POST["odpowiedz"];
$temat=$_POST["temat"];
$sql = "INSERT INTO forum_posty VALUES (NULL, '$tresc', '$user', '$rodzic', '$temat')";
if($result) echo'<a href="temat.php?temat='.$_POST['temat'].'">Powrót</a>'; ?>
jak widać kod wiele się nie zmienia, a po cofnięciu z niego do drugiego pliku wywala sesję całkowicie :/
nospor
23.08.2013, 11:45:04
no a temat.php startuje sesje?
kamilos809
23.08.2013, 11:51:23
Jasne

w nim też jest includowany plik globalny, bo niestety musi...
freemp3
23.08.2013, 12:06:33
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
23.08.2013, 12:57:17
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
class klasa{
public function __constructor(){
$_SESSION['foo'] = "bar";
}
public function rysuj(){
}
}
index.php
include "klasa.php";
$obiekt = new klasa;
$obiekt->rysuj();
var_dump pokazuje pusty string, lecz gdy dam session_start(); przed uzyciem $_SESSION wtedy działa jak należy.
nospor
23.08.2013, 13:05:12
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
23.08.2013, 13:11:08
@jackraymund nie __constructor() tylko __construct(). Z poprawną nazwą konstruktora śmiga aż miło.
kamilos809
23.08.2013, 13:32:06
z startowaniem sesji kombinowałem już w różnych kombinacjach. Jak wyrzucało, tak nadal wyrzuca :/
jackraymund
23.08.2013, 13:35:28
@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
23.08.2013, 13:49:46
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
23.08.2013, 13:52:40
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ć.
Warning: include(www\devana\language) [function.include]: failed to open stream: Permission denied in D:\Programy\VertrigoServ\www\devana\antet.php on line 3
Warning: include() [function.include]: Failed opening 'language/' for inclusion (include_path='.;D:\Programy\VertrigoServ\Smarty') in www\devana\antet.php on line 3
Warning
: mysql_fetch_row() expects parameter
1 to be resource
, boolean given in D
:\Programy\VertrigoServ\www\devana\func
.php on line
409
jackraymund
23.08.2013, 14:18:52
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
23.08.2013, 14:27:19
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
23.08.2013, 14:34:22
Aj chłopaki nie rozumiecie

Ten plik normalnie działa tylko ja trochę nakombinowałem

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
23.08.2013, 14:38:02
Ok. Sprawdziłeś czy po powrocie zaraz po wystartowaniu sesji jest ona poprawna?
kamilos809
23.08.2013, 16:15:36
a jak to sprawdzić?
Bo sesjami bawię się pierwszy raz
freemp3
23.08.2013, 22:13:34
Tak jak każdą inną zmienną:
kamilos809
24.08.2013, 11:43:11
I tyle mi to zmieniło co nic. Wiem to co wiedziałem i wam tłumaczyłem

plik z zapytaniem:
'user' => &
0 => string '1' (length=1)
1 => string 'edziu' (length=5)
2 => string '77316262ab419c32c8c38e6513eb9e5c' (length=32)
3 => string 'kamilos809@interia.pl' (length=21)
4 => string '5' (length=1)
5 => string '2013-08-07' (length=10)
6 => string '2013-08-24 10:18:32' (length=19)
7 => string '0' (length=1)
8 => string '127.0.0.1' (length=9)
9 => string 'Opisik' (length=13)
10 => string '1' (length=1)
11 => string '1' (length=1)
12 => null
13 => string 'default/' (length=8)
14 => string 'Założyciel' (length=10)
15 => string '0' (length=1)
16 => string 'pl.php' (length=6)
a po powrocie do pliku z formularzem:
'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
24.08.2013, 20:04:01
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
25.08.2013, 12:49:51
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ż

Zapytanie skopiowałem do pliku funkcyjnego, formularz przekierowałem na tą funkcje i działa jak marzenie

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