Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

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

Frage Entwicklung PHP

Mitglied: Mitchell

Mitchell (Level 2) - Jetzt verbinden

08.01.2012 um 11:37 Uhr, 3199 Aufrufe, 8 Kommentare

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:

01.
// LogIn mit der nötigen Abfrage (davor kommen noch welche, sind aber hier irrelevant) 
02.
 
03.
if (strtolower($name) == strtolower($row['user']) && $passwort == $row['passwort']) 
04.
05.
$_SESSION['user'] = $row['user']; 
06.
header ('Location: http://'.$_SERVER['SERVER_NAME'].'/index.php'); 
07.
}
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:

01.
function logout() 
02.
03.
if (isset($_SESSION['user'])) 
04.
05.
$_SESSION = array(); 
06.
if (isset($_COOKIE[session_name()])) 
07.
08.
setcookie(session_name(), '', time()-42000, '/').session_destroy(); 
09.
10.
echo "Erfolgreich abgemeldet"
11.
} else
12.
echo "Du bist nicht angmeldet"
13.
14.
}
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


Mit freundlichen Grüßen
Mitchell
Mitglied: nxclass
08.01.2012 um 13:54 Uhr
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.

01.
/** 
02.
 * @return bool 
03.
 */ 
04.
function logout() 
05.
06.
  if (isset($_SESSION['user'])) { 
07.
    $_SESSION = array(); 
08.
    if (isset($_COOKIE[session_name()])) { 
09.
      setcookie(session_name(), '', time()-42000, '/').session_destroy(); 
10.
11.
    return true; 
12.
13.
  return false; 
14.
}
Bitte warten ..
Mitglied: dog
08.01.2012 um 16:17 Uhr
"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".
Bitte warten ..
Mitglied: Mitchell
08.01.2012 um 21:29 Uhr
@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:

01.
function logout()  
02.
{  
03.
  if (isset($_SESSION['user'])) {  
04.
    $_SESSION = array();  
05.
    if (isset($_COOKIE[session_name()])) {  
06.
      setcookie(session_name(), '', time()-42000, '/').session_destroy();  
07.
    $true = echo "abgemeldet";  
08.
   } else
09.
   $false = echo "nicht abgemeldet"
10.
   }  
11.
12.
}
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

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

Mit freundlichen Grüßen
Mitchell
Bitte warten ..
Mitglied: dog
08.01.2012 um 23:53 Uhr
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.

Bitte warten ..
Mitglied: Mitchell
09.01.2012 um 06:49 Uhr
Naja, da du den Link gepostet hast, dachte ich, du zielst auch nur auf die Ausgabeoptionen ab
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.

Mit freundlichen Grüßen
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.
Bitte warten ..
Mitglied: Mitchell
09.01.2012 um 08:04 Uhr
so, danke nochmal für die Hinweise. Ich habs jetzt folgendermaßen gelöst:

01.
ob_start() 
02.
// Die HTML-Ausgabe 
03.
logout() 
04.
// restliche HTML-Ausgabe 
05.
ob_end_flush();
dem Logout noch was hinzugefügt:

01.
function logout() 
02.
03.
	if (isset($_SESSION['user'])) 
04.
05.
	$_SESSION = array(); 
06.
		if (isset($_COOKIE[session_name()])) 
07.
08.
			setcookie(session_name(), '', time()-42000, '/').session_destroy(); 
09.
10.
	echo "Erfolgreich abgemeldet"; 
11.
	$true = ob_get_contents(); 
12.
	} else { 
13.
	echo "Du bist nicht angmeldet"; 
14.
	$false = ob_get_contents(); 
15.
16.
}
wenn jemandem eine bessere Lösung einfällt...ich bin für alles offen

Mit freundlichen Grüßen
Mitchell

PS: den LogIn erwähnen wir nicht mehr ^^
Bitte warten ..
Mitglied: nxclass
09.01.2012 um 08:42 Uhr
$true = echo "abgemeldet";
$false = echo "nicht abgemeldet";
... was'n das für ein finsterer Hack ?

01.
$true = "abgemeldet"; 
02.
$false = "nicht abgemeldet";
... so sieht das schon besser aus - und deine HTML Ausgabe gehört in den Viewer nicht in deine logout() (Controller)
Bitte warten ..
Mitglied: Mitchell
09.01.2012 um 10:51 Uhr
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

Mit freundlichen Grüßen
Mitchell
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (17)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...