[PHP] Session Problem!

djjlx

---???---
ID: 62937
L
9 Mai 2006
599
21
Hallo!

Ich hab ein kleines Session Problem!

Also
Die Seite baut sich wie folgt auf!

include der checkuser.php (Code weiter unten)
html Code für design
in tabelle wird der PHP code gelesen per include

CODE der INDEX.php
PHP:
<?php 
include ("checkuser.php");
?>
<HTML>
<HEAD>...

<TD COLSPAN=3 ROWSPAN=6><?
	  if(!@$HTTP_GET_VARS["content"]) { $HTTP_GET_VARS["content"]="home"; }
		  switch ($HTTP_GET_VARS["content"])
{
	case "home":	include "home.php";   break;
...
}
?>
</TD>

Also in der datei index.php wird zb. inlcude ("home.php") aufgerufen

wenn ich in der home.php nun etwas aus den Sessions auslesen will funktioniert das nur wenn in der home.php auch ein session_start() steht.

wenn ich aber das session_start einfüge bekomm ich 2 Fehlermeldungen:

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at .../member/checkuser.php:9) in .../member/home.php on line 2

Line 2 in der home.php = session_start();

Warning: Cannot modify header information - headers already sent by (output started at .../member/checkuser.php:9) in ...member/checkuser.php on line 6

Checkuser.php CODE:
PHP:
<?php  
$user_id = $_SESSION["user_id"];
if (!empty ($user_id))  
{  
  header ("Location: ../index.php");  
}  
?>

So schreib ich nun @ session_start(); in der home.php wird die erste fehlermeldung unterdrückt die zweite nicht!
Woraus ich eigentlich schließe das die zweite fehlermeldung session_start nicht betrifft!

entferne ich session_start(); aber sind beide fehlermeldungen weg!
Aber ich kann mit
PHP:
$id = $_SESSION["user_id"];
keine ID auslesen ausser es steht session_start in der home.php dann funktionierts.

Klar die zweite meldung weil ich ja schon eine Ausgabe davor habe.

Aber warum kann ich aus den Sessions nur was auslesen wenn ich der datei auch session start steht ???

Ich hab auch probiert das Session_start in der index.php gleich in line 2 zu schreiben dann funktioniert jedoch diee checkuser nicht und es erfolgt gleich der logout.

Weiß jemand wo mein fehler liegen könnte ???

Lg
 
a) HTTP_*_VARS[] ist veraltet, sollte nicht mehr benutzt werden. Kein Fehler, sollte man aber wissen.
b) Dein HTML-Code sieht sehr ... naja aus... auch kein Fehler, wills aber mal gesagt haben.
c) Außerdem hat HTML-Code in einem PHP-Script eigentlich nix verloren.

Zum eigentlichen:
Du kannst nur das $_SESSION[]-Array benutzt, wenn du die Session vorher mit session_start() startest. session_start() sendet Header, da es ja die Session über den Sessionhash, der im Keks abgespeichert wird, identifizieren muss.
Tätigst du vorher Ausgabe, kann der Header folglich nicht gesendet werden, deshalb die Warnung, dass die Session nicht benutzt werden kann.

Um das Problem zu lösen (und c) gleichzeitig mit), verwende ein Template-System. Dieses sorgt dafür, dass die Ausgabe erst nach dem Abarbeiten der Logik gemacht wird und du jederzeit HTTP-Header senden kannst.
 
ich gib auch mal meinen Senf dazu, wie schon gesagt, der Fehler "Cannot modify header information" bedeutet, dass du einen header() oder session_start() verwendet hast, nachdem schon was an den browser gesendet wurde(ergo nachdem der head bereich schon geschlossen wurde)


session_start() heisst für PHP, dass es die session-id wenn vorhanden nimmt, und in einer temporären Datei variablen sucht und speichert. Warum muss das session_start() da sein? Ganz einfach, logischerweise verbraucht der Datei-zugriff scriptzeit. Wenn die session nicht verwendet wird, sollte sie auch nicht geladen werden. Deswegen muss man php anweisen sie zu laden, mit session_start()





und nochwas: du kannst in eine Session variable nix schreiben, wenn du einen header("Location: ..."); verwendest.

PHP:
session_start();
$_SESSION['user_id']=$_GET['user_id'];
header("Location: index.php");

bei diesem Beispiel würde $_SESSION nicht gespeichert werden.

lg Salkin

PS: Du solltest dir wirklich überlegen ein Template-System zu nehmen...
 
Zum eigentlichen Problem:

Bevor Du mühsam auf Templatesystem umstellst, schreib an den Anfang des Skriptes mal ob_start();. Das sollte das Problem schon beheben.

und nochwas: du kannst in eine Session variable nix schreiben, wenn du einen header("Location: ..."); verwendest.

PHP:
session_start();
$_SESSION['user_id']=$_GET['user_id'];
header("Location: index.php");

bei diesem Beispiel würde $_SESSION nicht gespeichert werden.
Sorry, aber wie kommst Du denn auf den Trichter? Das klappt mit Standardeinstellungen des Servers eigentlich problemlos...
 
oh sry...hast recht mit standart geht es doch...nur nicht auf meinem server...sry^^

EDIT: mmh, ok, hab schon gefunden woran es liegt: die header("Location: ...") verhindert dass der session-cookie gesetzt wird, demnach geht es wenn session_start schon vorher deklariert wurde.
 
Zuletzt bearbeitet:
MOrgen!

Also ich hab jetzt auch einen fehler gefunden!

PHP:
<?php   
$user_id = $_SESSION["user_id"]; 
if (-->!<--empty ($user_id))   
{   
  header ("Location: ../index.php");   
}   
?>

Hab jetzt das ! weggenommen und auf der Index als ersters session start und sonst niergends und funktioniert!

Wer jetzt mal ein paar Infos über ein Templets System googglen!
An dieser Stelle danke auch für die Hinweise!

LG