PHP sessions funktionieren nicht

Fou-Lu

Lt. Junior Grade
Registriert
Aug. 2006
Beiträge
290
einen schönen Abend an alle,
ich hab in den letzten Tagen mich wieder bisschen an PHP versucht und bin da auf ein seltsames Problem gestoßen.

Es geht um ein Login-Script für eine kleine Mitgliederverwaltung.
In meiner index.php gleich in der zweiten Zeile rufe ich nämlich die Funktion "start_session()" auf.
Anschließend wird natürlich geprüft ob bestimmte Session-Variablen gesetzt sind oder nicht und darauf reagiert. Sollten sie nicht gesetzt sein dann wird man zum Login-Formular geleitet und nach einer Authentifizierung gesetzt.

Nun.... jetzt ist es aber so, dass bei mir auf dem PC unter XAMPP alles wunderbar funktioniert.
Sobald ich es aber auf meinen Webspace bei 1und1 rauflade, läuft gar nichts mehr!!

In der Verwaltung kann ich zwischen PHP 5.2 und PHP 5.4 auswählen.
Wenn ich 5.2 einstelle, dann bekomme ich stets folgende Meldung:

PHP:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ..../index.php:1) in ..../index.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at ..../index.php:1) in ..../index.php on line 3

Wenn ich es auf PHP 5.4 einstelle, dann verschwindet zwar die Fehler-Meldung, aber wenn ich dann nach dem Login versuche eine Session-Variable zu setzen

z.B:
PHP:
$_SESSION['nickname'] = 'Max Mustermann';

dann bleibt diese dennoch leer. Egal was ich mache es funktioniert nicht, während bei mir mit xampp alles wunderbar läuft.


Hat jemand schon mal ähnliche Probleme gehabt? Hoffe auf Hilfe und danke schon mal im vorraus ;-)
 
Hi,

welche Zeichenkodierung nutzt du für deine .php-Datei?

UTF8 mit BOM vielleicht?
 
jap. ist es die falsche? welche soll ich sonst benutzen?
 
UTF-8 ohne BOM. Oder wenn du keine Umlaute hast, dann auch einfach ANSI.

Aber du solltest die Datei dahin konvertieren, nicht einfach umspeichern. Notepad++ kann konvertieren.
 
Zuletzt bearbeitet:
Ok das konvertieren hat wirklich geholfen. Das würde schon mal funktionieren.

Jetzt hätte ich nur noch eine weitere kleine Frage :D
Ich habe eine Datei in der ich eine if-Abfrage habe (bezüglich der Sessions) und wenn es stimmt, dann wird return true zurückgegeben.
Auf den PHP seiten hab ich nämlich gelesen es wäre möglich. Nun auch wieder das selbe Problem. Auf xampp funktioniert es, auf dem webspace nicht.... -_-"

Gibts da irgendwas besonderes was man dabei beachten muss?
Die PHP-Datei mit der if-Abfrage wird immer mit if( (include('datei.php') ) == true ) eingebunden...

Aber auf dem Webspace bekomm ich folgende Fehlermeldung:

Fatal error: Can't use function return value in write context in ..../otherfile.php on line 10
 
So etwas kommt mir eher so vor wie etwas, das man so oder so nicht tun sollte...
 
mein Code:

PHP:
if( ( include( 'test.php' )) == true ) {
// ...
}

der code in dieser test.php:
PHP:
if( empty( $_SESSION['test'] ) OR $_SESSION['test2'] == "" OR $_SESSION['test3'] == "" ) {
echo 'nicht eingeloggt';
return false;
} else {
return true;
}

folgendes funktioniert auch nicht:
PHP:
if( ( include 'test.php' ) == true ) {
// ...
}

aber wie gesagt... auch nur auf dem webspace... -_-"
bei mir aufm pc unter xampp läufts einwandfrei.

ich wollte halt die abfrage bezüglich eingeloggt oder nicht eingeloggt in eine extra datei auslagern, damit ich es an nötigen stellen nur so includieren muss und nicht jedes mal die volle abfrage hinschreiben.
außerdem sollten sich änderungen ergeben, dann müsste ich es nur an einer stelle ändern und nicht in allen files danach suchen... :D
 
und wenn du zwei user auf deiner seite hast, einer davon eingeloggt ist, ist der andere dann auch eingeloggt?
warum willst du ein neues, unsicheres system entwerfen, wenn es session und cookies gibt, die das für dich übernehmen?
dein vorhaben ist aber lieber in eine datenbank zu legen
 
hä? versteh jetzt deine frage nich so ganz.
ich benutz ja sessions, aber man muss ja auch wissen ob diese session gesetzt ist oder nicht (sprich ist der user gerade eingeloggt oder eben nicht).

dafür ja die if-abfrage... aber gehen wir davon aus, dass ich eine index.php habe und auf dieser seite sind z.B. 3 bereiche die nur für eingeloggte user sichtbar sein sollen.

soll ich jetzt an drei verschiedenen stellen jedes mal if( $_session['nick'] ... ) schreiben? da mach ich doch lieber 1 mal und include das einfach. sollte sich nämlich an der abfrage was ändern z.B. dass ich später nach mehr als nur einem nick oder einer ip abfrage, dann muss ich es nur an einer einzigen stelle warten und nicht an 3....

vielleicht hab ich dich aber auch falsch verstanden :p :D
muss zugeben ich bin in php überhaupt derzeit außer übung und muss mich wirklch ganz schön wieder einarbeiten... -_-

auf dem jetzigen stand meines login-scripts ist man z.b. nach dem login dauerhaft eingeloggt.... soll ja auch nich sein. ich setze momentan nur die session und benutz aber keine cookies.

wie lösen das andere so? habt ihr tipps, vorschläge, beispiele? :)
bin für alles dankbar ;)
 
PHP:
if( empty( $_SESSION['test'] ) OR $_SESSION['test2'] == "" OR $_SESSION['test3'] == "" ) {
echo 'nicht eingeloggt';
return false;
} else {
return true;
}

ich würde hier nie mit empty oder = "" arbeiten.
http://php.net/manual/de/function.isset.php um zu überprüfen ob die jeweilige session variable überhaupt gesetzt ist.

PHP:
auf dem jetzigen stand meines login-scripts ist man z.b. nach dem login dauerhaft eingeloggt.... soll ja auch nicht sein. ich setze momentan nur die session und benutz aber keine cookies.

wenn du nur sessions benutzt ist dein login so lange aktiv bis der user den browser schließt. erst dann wird die session ungültig.

was du machen kannst:
a) mit Keksen arbeiten
b) mit Datenbanken arbeiten

in der Datenbank kannst du per timestamp den aktuellen Zeitpunkt festhalten. im Code hast du eine maximale Lebensdauer eine Session definiert - z.B. 300 Sekunden) bei jedem Seitenreload prüfst Du also nun ob dein alter Timestamp + 300 Sekunden mehr ist, als der aktuelle Zeitstempel, wenn ja, setzte den aktuellen Zeitstempel wieder in die Datenbank (session refresh). Wenn nein, logge den User aus.
 
Zu dem Timestamp und den Keksen klingt gut. So könnte ich sogar eine Online-Ansicht ( welche User gerade online sind ) einrichten.

Was die Sessions angeht. Ich dachte eigentlich auch, dass die gültig sind bis der Browser geschlossen wird.
Ist aber nicht der Fall :-/
Wenn ich nicht explizit auf ausloggen klicke (wo dann alle sessions per unset und session_destroy gelöscht werden), dann bin ich auf dem Rechner selbst nach mehreren Tagen noch eingeloggt (völlig egal ob ich Browser geschlossen hatte oder den PC neugestartet).
 
Manche Browser behalten den Session Cookie (jep, Sessions sind effektiv auch Kekse) eben auch nach dem Abschalten. Du wirst ja wohl kaum Sessions in die URL packen...
Außerdem zählt oftmals auch, was die Server Cookie Lebenszeit sagt.
 
Hammermäßigen Dank an Crizzo für den erhellenden Hinweis auf dieses heimtückische BOM ganz am Anfang des Threads.
Hatte dasselbe Problem und seit einer Woche in allen möglichen Foren gesucht, leider immer nur in Sackgassen getappt.
Mein Verdacht war auch, daß die PHP-Versionen meines privaten Servers und des 1und1-Servers unterschiedlich sein müssen. In der Richtung alles versucht, aber nichts half.
Heute lese ich das erste Mal über die Möglichkeit des BOM und Volltreffer!! Das rettet mir den Tag :-))

Auch der Link zu den Erläuterungen war sehr hilfreich. Super Sache.
 
Zurück
Oben