mitchell
Goto Top

Das übliche Spiel -Cannot modify header information - headers already sent by-

Hi,

ich hänge nun seit Stunden an diesem Fehler und komme auf keinen grünen Zweig. Vorab möchte ich aber noch dazusagen, dass auf dem XAMPP alles wunderbar funktioniert, auf dem realen Server...naja, sehts euch an:

Ich habe hier ein Login-Script und ein Logout-Skript, beide bereiten mir Probleme. Lassen wir also erstmal Code sprechen:

// LogIn mit der nötigen Abfrage (davor kommen noch welche, sind aber hier irrelevant)

if (strtolower($name) == strtolower($row['user']) && $passwort == $row['passwort'])  
{
$_SESSION['user'] = $row['user'];  
header ('Location: http://'.$_SERVER['SERVER_NAME'].'/index.php');  
}

Führe ich das Skript aus, bin ich auch angemeldet, erhalte aber vorher den Fehler "Cannot modify header information - headers already sent by..."

Das würde ich sogar noch einsehen, da zuvor wirklich eine HTML-Ausgabe folgt und ich die Funktion dann erst einbinde. Später komme ich dann noch mit dem "wie mach ich das", aber lassen wir es jetzt erstmal bei dem "wieso sagt mir XAMPP sowas nicht"? Der meckert ja auch sonst überall rum mit den Notice-Meldungen, die eingeschaltet sind

Nun der nächste Code, bei dem ich nun wirklich verzweifle...weil ich nicht weiß, was der Interpreter von mir will:

<code type="php>
function logout()
{
if (isset($_SESSION['user']))
{
$_SESSION = array();
if (isset($_COOKIE[session_name()]))
{
setcookie(session_name(), '', time()-42000, '/').session_destroy();
}
echo "Erfolgreich abgemeldet";
} else {
echo "Du bist nicht angmeldet";
}
}


selbe Meldung wie oben. Auch diese Funktion bette ich ein, also vorher eine HTML-Ausgabe. ABER: Warum die Header Meldung? Ich modifiziere hier doch gar nichts. Jediglich "session_start();" wird vor der HTML-Ausgabe aufgerufen.

Ich bin übrigens abgemeldet, aber so ein Warning auf der Webseite ist ja auch hässlich :P

Kann mir jemand sagen, wo mein Denkfehler liegt? Vielleicht werde ich langsam auch einfach zu müde


Mfg
Mitchell

Content-Key: 178543

Url: https://administrator.de/contentid/178543

Printed on: April 25, 2024 at 07:04 o'clock

Member: nxclass
nxclass Jan 08, 2012 at 12:54:10 (UTC)
Goto Top
Warum die Header Meldung? Ich modifiziere hier doch gar nichts
nein - Aber sobald Du ein echo machst, "modifiziert" (sendet) dein Server die Header Informationen für dich.

/**
 * @return bool
 */
function logout()
{
  if (isset($_SESSION['user'])) {  
    $_SESSION = array();
    if (isset($_COOKIE[session_name()])) {
      setcookie(session_name(), '', time()-42000, '/').session_destroy();  
    }
    return true;
  }
  return false;
}
Member: dog
dog Jan 08, 2012 at 15:17:11 (UTC)
Goto Top
"wieso sagt mir XAMPP sowas nicht"?

http://www.php.net/manual/de/intro.outcontrol.php


Übrigens ist alles außerhalb von PHP-Blöcken (Leerzeilen etc.) auch eine "Ausgabe".
Member: Mitchell
Mitchell Jan 08, 2012 at 20:29:58 (UTC)
Goto Top
@nxclass: Merci, ich dachte, nur die Session- und Headerfunktionen würden dies explizit tun.
Deine Variante habe ich aber vorher auch schon probiert, funktioniert natürlich, allerdings gibt es dann keine Ausgabe. Habs dann so probiert:

function logout() 
{ 
  if (isset($_SESSION['user'])) {   
    $_SESSION = array(); 
    if (isset($_COOKIE[session_name()])) { 
      setcookie(session_name(), '', time()-42000, '/').session_destroy();   
    $true = echo "abgemeldet";   
   } else {
   $false = echo "nicht abgemeldet";  
   } 
                                                    }
}

um die Variable dann in einem <div> ausgeben zu lassen. Allerdings bekomme ich immer nur den Wert der Variable $true. Aber gut, wird das kleinste Problem sein, wenn man mal wieder einen klaren Kopf hat face-smile

@dog: Dass alles außerhalb eine Ausgabe in dem Sinne ist, weiß ich...aber was soll mir das Manual sagen?

Mfg
Mitchell
Member: dog
dog Jan 08, 2012 at 22:53:41 (UTC)
Goto Top
Hättest du dir das Kapitel im Handbuch mal durchgelesen, dann hättest du herausgefunden das XAMPP die output_buffering = On Direktive benutzt, und somit zuerst nur Header ausgibt und erst wenn der Parser völlig durchgelaufen ist den Content der Seite.
Auf dem Webserver wiederum ist das deaktiviert und der sendet darum Header und Content gemischt, so schnell wie eben möglich - und das ist eben per HTTP-Spezifikation nicht möglich.

face-smile
Member: Mitchell
Mitchell Jan 09, 2012 at 05:49:48 (UTC)
Goto Top
Naja, da du den Link gepostet hast, dachte ich, du zielst auch nur auf die Ausgabeoptionen ab face-smile
Aber gut, hab mir das Teil nun mal ganz durchgelesen...dort steht, dass XAMPP output_buffering = OFF benutzt und so ist es bei mir auch eingestellt.

Mfg
Mitchell

EDIT: Schau mal einer an, jetzt spuckt XAMPP die Meldung aus. Was war der Grund? Die php.ini war unten komplett auskommentiert, frag mich bitte nicht, warum.
Member: Mitchell
Mitchell Jan 09, 2012 at 07:04:12 (UTC)
Goto Top
so, danke nochmal für die Hinweise. Ich habs jetzt folgendermaßen gelöst:

ob_start()
// Die HTML-Ausgabe
logout()
// restliche HTML-Ausgabe
ob_end_flush();

dem Logout noch was hinzugefügt:

<code type"php">
function logout()
{
if (isset($_SESSION['user']))
{
$_SESSION = array();
if (isset($_COOKIE[session_name()]))
{
setcookie(session_name(), '', time()-42000, '/').session_destroy();
}
echo "Erfolgreich abgemeldet";
$true = ob_get_contents();
} else {
echo "Du bist nicht angmeldet";
$false = ob_get_contents();
}
}


wenn jemandem eine bessere Lösung einfällt...ich bin für alles offen face-smile

Mfg
Mitchell

PS: den LogIn erwähnen wir nicht mehr ^^
Member: nxclass
nxclass Jan 09, 2012 at 07:42:34 (UTC)
Goto Top
$true = echo "abgemeldet";
$false = echo "nicht abgemeldet";
... was'n das für ein finsterer Hack ?

$true = "abgemeldet";  
$false = "nicht abgemeldet";  
... so sieht das schon besser aus - und deine HTML Ausgabe gehört in den Viewer nicht in deine logout() (Controller)
Member: Mitchell
Mitchell Jan 09, 2012 at 09:51:55 (UTC)
Goto Top
Zitat von @nxclass:
> $true = echo "abgemeldet";
> $false = echo "nicht abgemeldet";
... was'n das für ein finsterer Hack ?

da waren die Finger schneller, als Copy & Paste. Das "echo" hatte ich natürlich nicht drin face-smile

Mfg
Mitchell