• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Header-Weiterleitung Problem - Cannot modify header information

Tobi44

Mitglied
Hallo,

seitdem ich in einer anderen PHP Datei einen Code eingesetzt habe, funktioniert eine andere PHP-Datei nicht mehr ordnungsgemäß. Folgende Fehlermeldung bekomme ich in der Log-Datei.
Cannot modify header information - headers already sent by (output started at /var/www/vhosts/xxx.com/httpdocs/xxx/neuesthema.php:34) in /var/www/vhosts/xxx.com/httpdocs/xxx/neuesthema.php on line 80, referer: xxx.com/xxx/neuesthema.php

in der neuesthema.php verwende ich an entsprechender Stelle (Zeile 80) folgendes:
PHP:
mysql_query("INSERT INTO xxxxxxxxx unwichtig xxxxxxxx") or die (mysql_error());
Header("Location: /xxx/neuesthema.php?posting=ok"); }
	}
if($_GET['posting'] === "ok") { Header("Location: /xxx/thema.php?id=$newthreadid"); }
Zwei mal eine Weiterleitung, da er bei der ersten gerade der Datensatz erst gespeichert wurde, damit funktioniert es nicht. Deshalb habe ich den Umweg über ?posting=ok gemacht. Das klappt auch. Der Absender bekommt DIREKT nach Klick auf Beitrag speichern seinen neuen Post angezeigt -

bis ich in einer anderen Datei (der header der kompletten Seite) folgendes eingebaut habe:
PHP:
<?php
$header_latest_forum_post = mysql_query("SELECT * FROM forum_themen ORDER BY timestamp_latest DESC LIMIT 1");
  while($rowx1 = mysql_fetch_array($header_latest_forum_post)){
	  $date_header_latest_forum_post = date('n/j/Y - h:i A',$rowx1['timestamp_latest']);
	  $date_header_latest_forum_post_ts = $rowx1['timestamp_latest'];
	  $date2_header_latest_forum_post_ts = $rowx1['timestamp'];
	  $poster_header_latest_forum_post = $rowx1['poster_latest'];
	  $threadname_header_latest_forum_post2 = $rowx1['name'];
	  $threadtext_header_latest_forum_post3 = htmlentities($rowx1['text']);
	  $id_header_latest_forum_post = $rowx1['id'];
	  $forumid_header_latest_forum_post = $rowx1['forumid'];
}
$header_latest_forum_post2 = mysql_query("SELECT * FROM forum_beitraege ORDER BY timestamp DESC LIMIT 1");
  while($rowx2 = mysql_fetch_array($header_latest_forum_post2)){
	  $text_header_latest_forum_post3 = htmlentities($rowx2['text']);
	  $timestamp_header_latest_forum_post = $rowx2['timestamp'];
}
// Überprüfen, ob letzter Beitrag einem Thema entspricht oder ein Reply ist.
if ($date_header_latest_forum_post_ts === $date2_header_latest_forum_post_ts) { $text_header_latest_forum_post3 = $threadtext_header_latest_forum_post3; } else { $text_header_latest_forum_post3 = $text_header_latest_forum_post3; }

$header_latest_forum_post3 = mysql_query("SELECT * FROM forum_foren WHERE fid = '$forumid_header_latest_forum_post' ORDER BY id DESC");
  while($rowx3 = mysql_fetch_array($header_latest_forum_post3)){
	  $forum_header_latest_forum_post = $rowx3['name'];
}
if(strlen($threadname_header_latest_forum_post2) > 18) {
 $threadname_header_latest_forum_post = substr($threadname_header_latest_forum_post2, 0, 18)."...";
         } else {
 $threadname_header_latest_forum_post = $threadname_header_latest_forum_post2;
         }
if(strlen($text_header_latest_forum_post3) > 47) {
 $text_header_latest_forum_post = substr($text_header_latest_forum_post3, 0, 47)." ... <strong><a href=\"/xxx/thema.php?id=$id_header_latest_forum_post\" style=\"font-family:Verdana; font-size:7pt; color:#157ebc;\">more &raquo;</a></strong>";
         } else {
 $text_header_latest_forum_post = $text_header_latest_forum_post3;
         }
echo '
<div id="xxx" /><span style="float:right; font-size:7pt;"><strong>Forum</strong><a 
href="/xxx/forum.php?id=f'.$forumid_header_latest_forum_post.'" style="margin-left:4px; color:#157ebc; font-weight:bold;">'.$forum_header_latest_forum_post.
'</a></span><span class="h" style="border-bottom: 1px dotted #6b6b6b;">Latest forum post:</span><br /><span style="float:right; font-size:7pt;"><strong>User</strong><span style="margin-left:4px; color: #8B1A1A; font-weight:bold;">'.
$poster_header_latest_forum_post.'</span></span><strong>Topic</strong><a href="/xxx/thema.php?id='.$id_header_latest_forum_post.'" style="margin-left:4px; color:#157ebc; font-weight:bold;">'.$threadname_header_latest_forum_post.' &raquo;</a><br 
/><span style="color:#B07506;">'.$text_header_latest_forum_post.'</span></div>
';
?>

Ich kann mir nicht erklären, warum seitdem beim Absenden der neuesthema.php nicht mehr die header-Weiterleitung funktioniert.
Jemand eine Idee?

Btw. Wie ihr seht, ist alles total zusammengefriemelt - ich kann es halt nicht besser, aber wenigstens funktioniert (fast) alles so wie es soll. Und Namen für Variablen kann ich mir nun mal auch nicht gut und geschickt ausdenken. ^^
 
Du liest die Fehlermeldung falsch, der entscheidende Teile ist
output started at /var/www/vhosts/xxx.com/httpdocs/xxx/neuesthema.php:34
Da wird schon etwas vor der Header-Anweisung ausgegeben, das darf nicht sein.

Und nochwas. google liefert mit "cannot modify header information - headers already sent"
Ungefähr 21.800.000 Ergebnisse
Das sollte eigentlich reichen, oder?
 
Ich habe schon eben gelesen dass bei der Verwendung von header nichts anderes (HTML) zuvor kommen darf. Nur _wo_ darf nichts kommen? Vor dem gesamten Inhalt einer php-Datei? Das ist doch unmöglich, da ich diesen header-Befehl ja an genau dieser Stelle brauche.

Desweiteren ist es mir ein Rätsel, weshalb gerade nach dem Einfügen des geposteten Codes in der Headerdatei der Website die header-Funktion in der Datei neuesthema.php nicht mehr richtig klappt. In meiner Header-Datei, die logischerweise in jeder anderen Datei der Website eingebunden wird, sind ja mehrere solcher sql-Abfragen, bspw. zum Anzeigen des letzten Kommentares im Header neben dem Logo usw. Ich habe diese Datei nun lediglich um die Ausgabe des letzten Forum-Beitrages erweitert. Seither klappt das nicht mehr richtig. Wie soll man das verstehen?

Bezüglich Deinem Hinweis: An der neuesthema.php wurde nichts verändert. Was heißt denn die :34 hinter dem .php? Bei einigen Versuchen stand dort auch mal :33, jetzt :34.
Wie gesagt, wo genau darf denn "vorher" nichts ausgegeben werden?

Danke für die schnelle Antwort.
 
Zeile 34 der neuesthema.php beinhaltet keinen PHP-Code sondern die Ausgabe eines Navigationslinkes...
Die neuesthema.php beinhaltet überhaupt kein echo oder sonstige Ausgabe.

Der eingefügte Teil zum Anzeigen des letzten Forumposts in der header.php-Datei enthält natürlich eine Ausgabe, wie sonst soll ich denn den div-Kasten mit dem letzten Forumpost ausgeben????
Außerdem enthielt meine header.php-Datei schon zuvor eine ähnliche Ausgabe für den zuletzt geposteten Kommentar. Deshalb kann ich mir das ja nicht erklären.
 
Wenn du endlich mal google bemüht hättest, dann wüsstest du, dass vor Header keine Ausgabe passieren darf. Kein HTML-Code, kein Leerzeichen, keine echo-Ausgabe, absolut nix. Außerdem macht es auch wenig Sinn, etwas auszugeben, wenn man sowieso auf eine andere Seite weiterleitet. Und wenn deine header-Anweisung nach einer Ausgabe kommt, musst du dein Script entsprechend umbauen.
 
Ich habe doch geschrieben, dass ich gelesen habe dass vor header nichts kommen soll. Dennoch kommt bei mir vor header was. Und es klappt. Nun habe ich "noch was" vor header gesetzt (ebenfalls u.a. ein echo) und es klappt nicht mehr. Logik?

Außerdem macht es auch wenig Sinn, etwas auszugeben, wenn man sowieso auf eine andere Seite weiterleitet.
Diese Aussage macht auch wenig Sinn, da Du meine Beiträge scheinbar nicht korrekt gelesen hast.

Ich verwende eine header.php, die in JEDER Unterseite, wie neuesthema.php EINGEBUNDEN ist. Und das muss so sein, weil meine Seite so aufgebaut ist, dass der Header geladen wird, dann die Seiteninhalte und dann der Footer, ebenfalls included. Dass im Header dann auch echos und sql Abfragen und so nen Kram ist, ist unumgänglich. Oder wie soll ich meine Website sonst gestalten?

Danke, ich habe nun selbst meine Lösung gefunden, und mein "Script entsprechend umgebaut":

Vor diese eine, verdammte echo-Ausgabe ein ob_start(); und direkt danach ein ob_flush(); gesetzt, funktioniert es wieder einwandfrei.

Danke & Gruß
 
Dennoch kommt bei mir vor header was. Und es klappt.
Gegen PHP-Code spricht auch nichts, solange kein echo, print_r etc. benutzt wird.
Vor diese eine, verdammte echo-Ausgabe ein ob_start(); und direkt danach ein ob_flush(); gesetzt, funktioniert es wieder einwandfrei.
Und genau das ist ein Zeichen für schlechten Programmierstil!!! Nochmal: wenn man sofort weiterleiten will, macht eine Ausgabe keinen Sinn! Und sowas mit den Output-Buffering zu beheben, ist einfach nur grausam!!!
 
Du scheinst demnach meine Problematik noch nicht verstanden zu haben.

Mir bleibt gar nichts anderes übrig. Meine header.php-Datei ist ja immer vorhanden. Sie enthält den Aufbau / die Struktur der Website, bzw. beginnt damit. Meine footer-Datei beendet dies. In der Header-Datei werden somit auch SQL-Abfragen und dementsprechend auch zugehörige Ausgaben stattfinden, um im Kopf der Seite bspw. schön den zuletzt geposteten Kommentar darzustellen.
Alle Unterseiten, wie auch die neuethema.php enthalten per include die header.php. Was dann in diesen Dateien kommt, wie meine header-Weiterleitung in der neuesthema.php hat dann somit zwangsweise vorher PHP-Code und Ausgaben und so weiter...
Dass ich nicht extra einen Inhalt ausgebe, der sowieso niemandem angezeigt wird, weil direkt auf eine andere Seite geleitet wird, sollte klar sein.

Und genau das ist ein Zeichen für schlechten Programmierstil!!!
Danke für das Kompliment. Aber auch das ist mir bewusst.


Und sowas mit den Output-Buffering zu beheben, ist einfach nur grausam!!!
Danke für den Hinweis. Kannst Du mir wenigstens erklären, warum? Für mich sieht es so aus: Es funktioniert (wieder) und das Problem ist damit behoben.

Gruß
 
Du scheinst demnach meine Problematik noch nicht verstanden zu haben.
Ich habe das sehr gut verstanden. Nur du hast nicht verstanden, dass dein Aufbau fehlerhaft ist. Die Überprüfung, ob weitergeleitet werden soll, muss zu allererst gemacht werden. Wenn weitergeleitet werden soll, hast du dann eben noch nichts ausgeben.
Danke für den Hinweis. Kannst Du mir wenigstens erklären, warum?
Weil du damit deine fehlerhafte Programmierung korrigieren musst, anstatt es richtig zu machen.
 
Vielen Dank für Deine Hilfe. Bei viel Zeit kann ich es dann mal "richtig" machen. :-D

Vorläufig gebe ich mich aber mit dieser Lösung zufrieden.
 
Das hast Du gesagt... Kannst Du gerne so verstehen, so wie Du es möchtest. Aber ich bin immer bereit, Neues zu probieren. Nur halt dann, wenn die Zeit und vor allem die Lust es zulassen. Mindestens eins von beiden ist momentan noch nicht so weit... ^^

Wollte das nur nicht unkommentiert lassen. :-p
 
Vielen Dank für Deine Hilfe. Bei viel Zeit kann ich es dann mal "richtig" machen. :-D

Vorläufig gebe ich mich aber mit dieser Lösung zufrieden.

Nun kann man sowas recht einfach dadurch lösen, indem man z.B. eine SESSION-Variable quasi als Flag mit dem header befüllt, die durch session_start() durch deine Scripte gereicht wird.
Ist sie leer, erfolgt die Ausgabe, ansonsten wird ein header($_SESSION['header']); durchgeführt.

Prinzipell ist dem EAV-Prinzip zu folgen, da gibt es kein Wenn und Aber.

Prinzipell2 ist alles, was funktioniert nicht grausam oder falsch, sondern korrekt, sonst würde es nicht funktionieren. Ob solche Cache-Sachen dann elegent sind, ist eine andere Frage.

Aus Erfahrung weiss ich, dass solche Kunstriffe oftmals die einzige Möglichkeit sind, nachträgliche Wünsche erfüllen zu können, weil der Mehraufwand sonst nie bezahlt würde.
 
Hallo zusammen,

ich komme in der Problematik nicht weiter.

Ich habe nun eine redirect-Funktion erstellt, die mir halt auch mittels header() (womit sonst) weiterleitet. Diese Funktion ist in meiner header-Datei ganz am Anfang eingebunden, vor jeglicher Ausgabe.

Da ich die Funktion aber erst in einer php-Datei, in der die header-Datei logischerweise eingebunden ist (und in meiner header-Datei kommen nun mal weiter unten schon echo Ausgaben), aufrufe, funktioniert auch dies nicht.

Ich möchte ungern eine html-meta-Weiterleitung einbinden. Wieso zum Teufel ist denn das nicht mit der php-Weiterleitung hinzukriegen?

Wer weiß Rat?

Ach PS @ bdt600 - soviel dazu:
bdt600 schrieb:
Mit anderen Worten "nie" Habe ich schon so oft gehört/gelesen und irgendwann kamen andere Fragen zu dem Script und der Käse war immer noch drin.
 
Kopier hier mal Deine Code-Zeile rein - sonst ist das schwer zu helfen.

Du solltest erst die Weiterleitung mit Header veranlassen und danach die weitere Scriptausführung abbrechen mit die();
 
Ich frage mich schon seit gestern, warum Du um's Verrecken etwas ausgibst um dann anschließend ne Weiterleitung per header() machen willst. Wenn der User nicht sehr schnell lesen kann, würde der ja so oder so nüscht von dem was Du per echo ausgibst lesen können. Ich vermute mal, Du hast da irgendeine total verquere Logik in dem Script.

Kann es sein, dass es sich bei dem Script um ein Formular incl. Prüfung der Eingabe handelt?
 
Aufbau wie folgt:

redirect.php:
PHP:
function redirect($target = "")
{
	$host = htmlspecialchars($_SERVER['HTTP_HOST']);
	$url = rtrim(dirname(htmlspecialchars($_SERVER['PHP_SELF'])), "/\\");
	header("Location: http://$host$url/$target");
}

header.php:
PHP:
include('/var/www/vhosts/xxx.com/httpdocs/redirect.php');

Variablen, Codes usw. UND: echo-Ausgaben weiter unten in dieser Datei.

hallo.php:
PHP:
HTML-Code, PHP-Code ..

include('/var/www/vhosts/xxx.com/httpdocs/header.php');

redirect("/forum/thema.php?id=$newthreadid");

@thuemmy
Das hat sich bdt600 auch gefragt, und ich habe es mehrmals zu erklären versucht.
 
Sorry, dann ist der Aufbau der Datei falsch. Entweder Du willst was Ausgeben, dann musst Du dem User die Chance lassen das zu lesen, der redirect per header wenn er denn klappen würde, erfolgt ja sofort, oder Du willst, z.B. nach Prüfung von Formulareingaben sofort weiterleiten. Wenn das zweite der Fall ist, dann musst Du die Prüfung ganz an den Anfang des Scriptes stellen, und wenn die Eingaben korrekt sind, den redirect per header machen.

Aber ich versuche jetzt mal Deine Erklärung zu finden und auch zu verstehen
 
Zurück
Oben