Antworten auf deine Fragen:
Neues Thema erstellen

[PHP] header location

taffrot

Hat immer langweile...

Hey,

sitze zur Zeit an einem Projekt für den Informatikunterricht.
Es handelt sich um Portal, welches beim Login auf die Profilseite weiterleitet.

Es kommt beim absenden des Login Formulars zum allseits bekannten Fehler:

Code:
Warning: Cannot modify header information - headers already sent

Es wird auch an der Stelle ein header location aufgerufen, aber wie kann ich diesen Fehler verhindern. Klar, dadurch dass es vor dem verändern zu einer Ausgabe kommt,
da header location aber in einer funktion innerhalb einer Klasse aufgerufen wird, kommt es zwangsläufig dort irgenwann zu Ausgaben. Die Klassen werden im <head> Bereich der Seite included.

Wie kann ich das Problem am besten umgehen?
Meiner Meinung nach sollte dies zu lösen sein, wenn ich nur header location aufrufe, bevor die Klassen includiert werden, aber wie?



PHP:
//Session Variabeln setzen
			$_SESSION['userid'] 	= $data['ID'];
			$_SESSION['username'] 	= $data['Username'];
			$_SESSION['email'] 		= $data['Email'];
			$_SESSION['group']		= $data['Benutzergruppe'];
			
			header('Location: profil.php');			
			
		}	else {
			header('Location: login.php?errmsg=1');
		}

Das ist der Teil der funktion, die nach dem Login aufgerufen wird. Wie kann ich es nun schaffen, dass die header funktion keine Probleme verursacht.

Bissl umständlich formuliert, aber ich hoff es klappt. Einfach fragen, welchen Codeteil ihr sehen wollt.

Liebe Grüße
taffrot
 

AlexanderBo

Gesperrt

AW:
PHP:
 header location[/b]

[B]es[/B] darf [B]kein [/B]output erfolgen...
speichere die .php als [B]UTF-8 ohne BOM


[/B]//edit[B]: [/B]es darf also auch [B]vorher[/B] kein [B]html[/B]output erfolgen
 
Zuletzt bearbeitet:

AlexanderBo

Gesperrt

AW:
PHP:
 header location[/b]

[quote="taffrot, post: 1472354"]hab alle BOM's entfernt, hilft leider auch nicht.[/quote]

neue datei erstellen als UTF-8 ohne BOM...
vom alten code copy&paste
datei speichern (alte überschreiben)

BOMs kann man nicht einfach so entfernen...

ansonsten poste den code...
 

taffrot

Hat immer langweile...

AW:
PHP:
 header location[/b]

Ich hab mittels einem .vbs script die BOM's entfernt. Hab auch danach im Hexeditor nachgeschaut. BOM's sind draußen. Daran kanns also nicht liegen.
 

netbandit

Aktives Mitglied

AW:
PHP:
 header location[/b]

Hallo taffrot:

Kannst Du mal in den [B]Quelltext[/B] der Fehlermeldung schauen ob [B]vor[/B] der Fehlermeldung noch irgendwelche Ausgaben erfolgen? Das Beste ist alles mal markieren; evtl. ist da noch ein Leerschitt, Umbruch oder Ähnliches vorhanden.

Grüße :)
 

taffrot

Hat immer langweile...

AW:
PHP:
 header location[/b]

jo, also vor der Fehlermeldung steht im Quelltext:

die Klasse user.php (dort tritt der eigentliche Fehler auf)
[php]
class user	{
	
	function Login($username, $passwort)	{
		include('config/config.php');
		
		

		//Datensätze überprüfen
		$sql = "SELECT * FROM ".$database.".js_users WHERE 
					(Username like '".$username."') AND 
					(Password = '".md5 ($passwort)."')"; 
		$result = mysql_query($sql);	
  
                //Benutzer gefunden && Benutzerdaten stimmen				
		if(mysql_num_rows($result) > 0)	{
			
			$data = mysql_fetch_array ($result); 

                 //Session Variabeln setzen
            $_SESSION['userid']     = $data['ID'];
            $_SESSION['username']     = $data['Username'];
            $_SESSION['email']         = $data['Email'];
            $_SESSION['group']        = $data['Benutzergruppe'];
            
            header('Location: profil.php');            
            
        }    else {
            header('Location: login.php?errmsg=1');
        }

und das <head> tag
PHP:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="css/main.css" />
<script type="text/javascript" src="js/jquery.js"></script>

<title>JSystems - Youtube Mediathek</title>
<?php

//Includen
	include('classes/database.php');
        include('classes/user.php');
	include('classes/common.php');
//Datenbankverbindung aufbauen
	database::connect();
	
//URL auslesen, ob logout erfolgen soll	
	if((isset($_GET['action'])) and ($_GET['action'] == "logout"))	{
		user::logout();
	}
 

AlexanderBo

Gesperrt

AW:
PHP:
 header location[/b]

[quote="taffrot, post: 1472391"]jo, also vor der Fehlermeldung steht im Quelltext:

die Klasse user.php (dort tritt der eigentliche Fehler auf)
[php]
class user    {
    
    function Login($username, $passwort)    {
        include('config/config.php');
        
        

        //Datensätze überprüfen
        $sql = "SELECT * FROM ".$database.".js_users WHERE 
                    (Username like '".$username."') AND 
                    (Password = '".md5 ($passwort)."')"; 
        $result = mysql_query($sql);    
  
                //Benutzer gefunden && Benutzerdaten stimmen                
        if(mysql_num_rows($result) > 0)    {
            
            $data = mysql_fetch_array ($result); 

                 //Session Variabeln setzen
            $_SESSION['userid']     = $data['ID'];
            $_SESSION['username']     = $data['Username'];
            $_SESSION['email']         = $data['Email'];
            $_SESSION['group']        = $data['Benutzergruppe'];
            
            header('Location: profil.php');            
            
        }    else {
            header('Location: login.php?errmsg=1');
        }
und das <head> tag
PHP:
<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="css/main.css" />
<script type="text/javascript" src="js/jquery.js"></script>

<title>JSystems - Youtube Mediathek</title>
<?php

//Includen
    include('classes/database.php');
        include('classes/user.php');
    include('classes/common.php');
//Datenbankverbindung aufbauen
    database::connect();
    
//URL auslesen, ob logout erfolgen soll    
    if((isset($_GET['action'])) and ($_GET['action'] == "logout"))    {
        user::logout();
    }
[/quote]


hau die beiden <?php ?> zusannem und das html-doctype+ co erst danach rein...
selbst das is ein output...
 

taffrot

Hat immer langweile...

AW:
PHP:
 header location[/b]

hab das jetzt zusammen und das doctype und co am ende der Datei:

[code]
Warning: Cannot modify header information - headers already sent by (output started at /users/nebulaorion/www/Youtube/includes/headers.php:32) in /users/nebulaorion/www/Youtube/classes/user.php  on line 29
[/code]
 

Zeile 32 in der headers.php wär dann </head> (kein leerzeichen am Ende)
und zeile 29 in user.php ist [php]header('Location: profil.php');

:(
 

Budo_ID

Noch nicht viel geschrieben

AW:
PHP:
 header location[/b]

Hallo,

um ein redirect mittels header location zu erreichen darf KEIN Zeichen vorher ausgegeben werden! 

Wenn Du schreibst "...Zeile 32 in der headers.php wär dann </head>...", dann ist das ein output. 

versuchs bitte mal auf diese Weise ( ich stelle es nur schematisch dar ) :

*** SEITENANFANG *** 
<?php
ergebnis = bieliebige_sql_anweisung;
if ( ergebnis ) {
   [COLOR=#000000][COLOR=#0000bb]header[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]'Location: profil.php'[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]
}
else {
   [COLOR=#000000][COLOR=#0000bb]header[/COLOR][COLOR=#007700]([/COLOR][COLOR=#dd0000]'Location: login.php[/COLOR][/COLOR][COLOR=#000000][COLOR=#dd0000]?errmsg=1[/COLOR][/COLOR][COLOR=#000000][COLOR=#dd0000]'[/COLOR][COLOR=#007700]);[/COLOR][/COLOR]
}
?>
HTML - CODE ( eigentlicher Seiteninhalt ) 
*** SEITENENDE ***



kurz zur Erklärung : 
*** SEITENANFANG *** und *** SEITENENDE *** sollen nur das Seitenanfang bzw. das Seitenende anzeigen. Es sind KEINE Ausgaben!!!

zunächst übernimmst du mittels php NUR die Steuerung der Seite bzw. deren Weiterleitung. erst DANACH werden die eigentlichen Inhalte in das Script geschrieben. Dieses umfasst Alle Ausgaben, egal ob es ein HTML - Gerüst ist oder eine PHP - testausgabe via echo o.ä.


Ich hoffe ich konnte Dir weiterhelfen und meine Erklärungen waren annähernd verständlich.
 
Zuletzt bearbeitet:

taffrot

Hat immer langweile...

AW:
PHP:
 header location[/b]

Hallo Budo_ID,

das hat mir geholfen, habe nun die Methodenaufrufe, die eine Weiterleitung beinhalten in den Head Bereich gesetzt, sprich es wird direkt am Anfang überprüft, ob das Loginformular abgesendet wurde.

Vielen Dank
Grüße
taffrot
 

stylux

Pixelchemiker

AW:
PHP:
 header location[/b]

An dieser Stelle lohnt vielleicht auch ein Blick auf:
[url=http://de.php.net/manual/en/ref.outcontrol.php]PHP: Output Control Functions - Manual[/url]
 
Es sollte natürlich vermieden werden Output zu erzeugen, wenn man noch mit Headern o.Ä. arbeiten will allerdings lässt sich das manchmal aufgrund des Scriptaufbaus nicht wirklich vermeiden.
 

AlexanderBo

Gesperrt

AW:
PHP:
 header location[/b]

[quote="stylux, post: 1474943"]...
Es [B]sollte[/B] natürlich [B]vermieden werden[/B] Output zu erzeugen,  wenn man noch mit Headern o.Ä. arbeiten will allerdings lässt sich das  manchmal aufgrund des Scriptaufbaus [B]nicht wirklich[/B] vermeiden.
[/quote]


es [B]darf [/B](!)[B] kein[/B] output sein/erfolgen...

[B]muss[/B] ja [B]vermieden[/B] werden - ansonsten kann man nicht irnxwo  hin-headern.
wenn man es selbst programmiert hat man schon die auswahl dass kein  output vorher erfolgt - da muss man sich dann genau überlegen was man  will ;)

selbst eine falsch abgespeicherte .php kann einen nicht sichtbaren  output erzeugen sodass es nicht zum hin-headern kommt. insofern immer  als UTF-8 ohne BOM speichern.
 

saila

Moderatorle

AW:
PHP:
 header location[/b]

Hi,

es macht keinen Sinn, in einer Klasse html-Ausgaben erfolgen zu lassen. Dein Problem der Fehlermeldung liegt selbst dann vor, wenn du die Klasse bzw. die entsprechende Methode nach einer HTML-Ausgabe inizialisiert bzw. die entsprechende Methode aufrufst.

Beispiel:
[php]
<div id="blub">
<?php
$sesson->methode(); /* mehtode mit header()-Funktion */
?>
</div>
führ zu einem klassischen Fehler.

Korrekt wäre somit:
PHP:
<?php
$session->methode(); /* methode mit header()-Funktion
?>
<div id="blub">
aslfdsaöfsafasfasf
</div>
Führ zu Fehlerfreiem ablauf.

Das ganze Thema zum Funktionsaufruf "header()" steht im übrigen auch im php-Manual.
 

taffrot

Hat immer langweile...

AW:
PHP:
 header location[/b]

Jo hab nun alles hinbekomm. Hab die Methoden nur an falscher Stelle initialisiert.
Danke an alle :)
 
D

domix

Guest

AW:
PHP:
 header location[/b]

Ein Tipp noch.
Benutze die Ausgabepufferung.
Ich würde erstmal ganzen HTML-Code nicht ausgeben, erst wenn die ganze Anwendung fertig ist kann der Output ausgegebn werden. Sollen vorher Weiterleitungen erfolgen, wie bei deinen Skript, werden keine Daten an den Browser ausgegeben.
Beispiel:
<?php
ob_start();

include 'eine_datei.php';

$obj = new Ausgabe;

/* Bis jetzt wird die komplette Ausgabe, egal ob Fehler, Warnungen oder HTML zwischengespeichert */
$obj->ausgeben('xhtml');

/* wenn alles fertig ist wird die Ausgabe in eine Variable gespeichert und der Puffer geleert */
$ausgabe = ob_get_clean();

/* Somit besteht die Möglichkeit den gesamten HTML-Code nochmal am ende zu parsen um eventuell Änderungen vorzunehmen, erfolgt jetzt z.B. eine weiterleitung mit header('Location: [url]http://site.com[/url]') wird sie immer funktionieren da die komplette Ausgabe, Fehler eingeschlossen, noch nicht an den Browser gesendet wurde */

/* erst mit echo wird alles gesendet */
echo $ausgabe;


[COLOR=#000000][COLOR=#007700][/COLOR][/COLOR]
 

stylux

Pixelchemiker

AW:
PHP:
 header location[/b]

[quote="AlexanderBo, post: 1474970"]es [B]darf [/B](!)[B] kein[/B] output sein/erfolgen...
 
[B]muss[/B] ja [B]vermieden[/B] werden - ansonsten kann man nicht irnxwo hin-headern.
wenn man es selbst programmiert hat man schon die auswahl dass kein output vorher erfolgt - da muss man sich dann genau überlegen was man will ;)
 
selbst eine falsch abgespeicherte .php kann einen nicht sichtbaren output erzeugen sodass es nicht zum hin-headern kommt. insofern immer als UTF-8 ohne BOM speichern.[/quote]
 
Ich hab die Referenz zum Output-Buffering nicht ohne Grund verlinkt.
Wenn man die Ausgabe zwischenspeichert, dann kann man sehr wohl irgendwo hin headern, weil erstmal keine Ausgabe erfolgt.
 

AlexanderBo

Gesperrt

AW:
PHP:
 header location[/b]

[quote="stylux, post: 1476778"]
Ich hab die Referenz zum Output-Buffering nicht ohne Grund verlinkt.
Wenn man die Ausgabe zwischenspeichert, dann kann man sehr wohl irgendwo hin headern, weil erstmal keine Ausgabe erfolgt.
[/quote]


hmmm... im account vertan¿ ;)
bisher hab ich von [B]dir[/B] in diesem thread nix gelesen ;)
 

saila

Moderatorle

AW:
PHP:
 header location[/b]

[quote="AlexanderBo, post: 1476883"]hmmm... im account vertan¿ ;)
bisher hab ich von [B]dir[/B] in diesem thread nix gelesen ;)[/quote]

Ob hier nichts gelesen von @stylux oder im Thread vertan - unabhängig davon hat er eben dennoch recht :) und stellt somit mit ob_start() und ob_flush() eine Alternative dar.
 

stylux

Pixelchemiker

AW:
PHP:
 header location[/b]

[quote="AlexanderBo, post: 1476883"]hmmm... im account vertan¿ ;)
bisher hab ich von [B]dir[/B] in diesem thread nix gelesen ;)[/quote]
@AlexanderBo:
Von [B]MIR[/B] hast du Post #12 gelesen, den du in #13 auch kommentiert hast.
Darauf hab ich mich dann in #17 bezogen.
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
118.635
Beiträge
1.538.449
Mitglieder
67.556
Neuestes Mitglied
Ggirl
Oben