php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Warning Cannot modify header information


 
Smartsoul
26-11-2005, 15:39 
 
Hallo Alle!

Habe ein Problem mit meinem Umleitungsversuch.

Die Fehlermeldung:

Warning: Cannot modify header information -
headers already sent by (output started at .../index.php:6)
in .../entry.inc.php on line 47

Mein Skript in der index.php beginnt ganz oben so:


<?php
ob_start();
session_start();
include 'inc/entry.inc.php';
time_check();
ob_end_flush();
?>


Versuche eine Prüfung zu machen, die bei jedem Seitenaufruf checkt, ob der User länger als x Sekunden keine Seite mehr aufgerufen hat, um ihn dann auf eine andere Seite umzuleiten.

In der entry.inc.php ruft die Funktion time_check() im Falle "länger als x Sekunden keine Eingabe" die Funktion logout() auf und die sieht so aus:


function logout()
{
header ("Location:logged_out.php");
$sql="UPDATE users
SET UserSession=NULL, timeout=NULL
WHERE UserSession='".session_id()."'";
mysql_query($sql);
}


Leider bin ich mit ob_start() usw. noch nicht zum Ziel gelangt. :confused:

Wundert euch nicht, wenn euch diese Skripte bekannt vorkommen. Habe sie im großen und ganzen hier aus dem Forum zusammengesucht. Mein Dank ist euch gewiss! :)

Gibt es ein Problem mit include 'inc/entry.inc.php'; oder woran könnte es noch liegen?

Bitte um eure Hilfe! THX

 
Abraxax
26-11-2005, 15:44 
 
zu faul zum suchen?

http://www.php-resource.de/forum/search.php?s=&action=showresults&searchid=776814&sortby=lastpost&sortorder=descending

http://www.google.de/search?hl=de&q=%22Cannot+modify+header+information%22&btnG=Google-Suche&meta=

 
Smartsoul
26-11-2005, 15:48 
 
Nein, eigentlich überhaupt nicht. Suche schon eine ganze Weile, aber vielleicht an den falschen Orten.

Aber werde mir das gleich mal anschauen!

 
Smartsoul
26-11-2005, 16:32 
 
Hab mich da erneut durchgelesen und bin aber außer auf folgende Meldung auf nicht viel gestoßen, was mir persönlich weiter hilft.

Aufrufe von header() müssen vor allen anderen Ausgaben an den
Client erfolgen. Es spielt keine Rolle, ob die Ausgabe durch einen HTML-
Bereich vor dem Script oder durch das PHP-Script selbst entsteht. Dabei
reicht als "HTML-Bereich" z. B. bereits ein einziges Leerzeichen vor dem öffnenden PHP-Tag (" <?php").

Dies ist aber, so weit ich das verstehe, bei mir der Fall (s. Skripte oben), oder?

Kann ja verstehen, dass euch dieses Thema nervt. Habe sicher auch schon an die 30 Threads zu diesem thema gelesen, aber leider bin ich zu blöd, den Fehler in meiner Programmierung zu finden.

 
Abraxax
26-11-2005, 16:34 
 
aufgrund deiner geposteten meldung ist das NICHT der fall.

 
Smartsoul
26-11-2005, 16:37 
 
Ich dachte die Ausgabe des HEADERS passiert mit dem ob_end_flush ?

An welcher Stelle macht mein Skript eine unerlaubte Ausgabe?

 
Smartsoul
26-11-2005, 16:39 
 
Ist es das session_start() ?

 
Abraxax
26-11-2005, 16:42 
 
probier es aus ... nur als tipp ... in der meldung steht auch drin, wo du suchen musst!

 
Smartsoul
26-11-2005, 16:55 
 
Habe session_start() an verschiedene Stellen verschoben. Allerdings erfolglos.

In Zeile 6 (index.php) steht ob_end_flush;

In Zeile 47 (entry.inc.php) steht header ("Location:logged_out.php");

Da hab ich gesucht und obiges gefunden.

 
Smartsoul
26-11-2005, 17:11 
 
O.K.

Habe nun

ob_end_flush();

entfernt bzw. in die entry.inc.php hinter

header ("Location:logged_out.php");

verschoben und plötzlich ist die Fehlermeldung weg. :cool:


ABER:

Werden jetzt die Header-Daten im Normalfall "User ist immer noch aktiv" überhaupt nicht mehr übermittelt? :confused:

Es gibt ja an keiner anderen Stelle in meinem Code mehr ein ob_end_flush() ...

 
Abraxax
26-11-2005, 17:30 
 
tja. schonmal was von if() gehört?

 
Smartsoul
26-11-2005, 17:47 
 
Hab ich schon!

... und sogar ausprobiert, aber leider bekam ich dann wieder
Warning: Cannot modify header information -
mit der entsprechenden Zeilenangabe.

Im if-Zweig schicke ich nach logout() mit der Header-Geschichte und im else-Zweig bekommt er das ob_end_flush().

Komischerweise durchläuft er scheinbar das ob_end_flush() im else-Zweig, auch wenn if=true ist!!! :confused:

 
Abraxax
26-11-2005, 18:53 
 
zeig mal dein if()

 
Smartsoul
26-11-2005, 19:38 
 
Hier ist das if


if ($grenze > $auslogg) logout();
else
{
ob_end_flush();
$sql = "UPDATE users
SET timeout=$zeit
WHERE UserSession='".session_id()."'";
mysql_query($sql);
}

 
Abraxax
26-11-2005, 19:40 
 
bist du sicher, dass dein if() nciht immer erfüllt ist?
hast du kontrollausgaben gemacht?

 
Smartsoul
26-11-2005, 19:52 
 
wenn mein if() immer erfüllt wäre, dann dürfte "else" doch gar nicht aufgerufen werden ...

... aber die meldung sagt ja, dass der header bereits aus dem "else" geschickt wurde

oder hab ich deinen einwand falsch verstanden?

 
Smartsoul
26-11-2005, 19:59 
 
tschuldige, du kennst die meldung ja gar nicht

output started at .../entry.inc.php:76

und 76 ist die zeile im else-zweig

 
Smartsoul
26-11-2005, 20:12 
 
habe jetzt im else-zweig noch eine abfrage eingebaut


else
{
if (!headers_sent())
{
ob_end_flush();
}
echo "Else-Zweig";
$sql = "UPDATE users
SET timeout=$zeit
WHERE UserSession='".session_id()."'";
mysql_query($sql);
}


allerdings mit dem selben ergebnis :(

 
Smartsoul
26-11-2005, 21:04 
 
Fehler gefunden!

Problem trat immer dann auf, wenn ich mit Logout-Button vor Ablauf der Zeit ausgeloggt habe. Darf natürlich nicht sein.

Also folgender Code im Elde-Zweig:


else
{
if (!isset ($_POST['logout']))
ob_end_flush();
$sql = "UPDATE users
SET timeout=$zeit
WHERE UserSession='".session_id()."'";
mysql_query($sql);
}


Ergebnis:
Keine Fehelrmeldung mehr in allen mir bekannten Fällen! :D

<----- THX and Close


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:46 Uhr.