xbrtll: Downloadscript - Header wurde schon gesendet

Hallo allerseits!

Als PHP-Anfänger habe ich mich mal an ein Script gewagt, mit dem ich einen passwortgeschützten Download realisieren will. Dabei ist folgendes herausgekommen:

  
<?php	  
	if(!isset($_POST['pass'], $_POST['id'])){  
		die ("Bitte verwende ein gültiges Formular von der Homepage!");  
	}  
	if(!("098f6bcd4621d373cade4e832627b4f6" == md5($_POST['pass']))){  
		die ("Du hast ein falsches Passwort eingegeben!");  
	}  
	else{  
		$download = $_POST['id'];  
		$filelist = array("testdatei" => "/usr/www/users/xbrtll/downloads/test.zip");  
		if(!isset($filelist[$download])){  
			die ("Der gewünschte Download ist nicht vorhanden!");  
		}  
		header("Content-Tye: application/zip");  
		header("Content-Disposition: attachment; filename=$download");  
		readfile($filelist[$download]);  
	}  
?>  

(Die Konstruktion über ID und den filelist-Array dient dazu, das Script später auf mehrere verschiedene Downloads ausweiten zu können.)

Jedoch funktioniert das nicht, denn wenn das Script mit korrekten Werten für Passwort und ID aufgerufen wird, kommt vom Server folgendes:

HTTP/1.1 200 OK
Date: Fri, 14 Aug 2009 23:50:53 GMT
Server: Apache/1.3.34 (Debian) mod_auth_pam/1.1.1 mod_gzip/1.3.26.1a mod_ssl/2.8.25 OpenSSL/0.9.8c mod_perl/1.29 mod_fastcgi/2.4.6 mod_jk/1.2.18 AuthMySQL/4.3.9-2 FrontPage/5.0.2.2635
X-Powered-By: PHP/5.2.10
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Content-Type: text/html
Content-Length: 443

<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /usr/www/users/xbrtll/download.php:1) in <b>/usr/www/users/xbrtll/download.php</b> on line <b>14</b><br />
<br />
<b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /usr/www/users/xbrtll/download.php:1) in <b>/usr/www/users/xbrtll/download.php</b> on line <b>15</b><br />
PK������������������

Wenn ich das richtig verstehe, können also die header-Funktionen nichts mehr am Header ändern, weil bereits vorher einer gesendet wurde. Warum aber ist das passiert? Und was kann ich dagegen unternehmen?

Falls wichtig, kann man die php-Konfiguration unter http://testen.de/info.php5 anschauen.

Oder gibt es eine grundsätzlich andere Herangehensweise, die ich wählen sollte? Ich habe mich dabei an einem Tutorial sowie dem php-Handbuch orientiert.

Schon mal vielen Dank an alle, die sich mein Problem angeschaut haben und hoffentlich auch antworten können!

Mit freundlichen Grüßen,

xbrtll

  1. Ohne das jetzt getestet zu haben: Speicherst du das Script vielleicht als UTF-8 mit BOM (Byte Order Mark)? Damit kommt PHP nämlich nicht klar. Müsste sich in deinem Editor abschalten lassen.

    1. Ohne das jetzt getestet zu haben: Speicherst du das Script vielleicht als UTF-8 mit BOM (Byte Order Mark)? Damit kommt PHP nämlich nicht klar. Müsste sich in deinem Editor abschalten lassen.

      Tatsächlich, das war das Problem. Hatte ich nirgends gelesen, dass man auf die Codierung aufpassen muss...

      Vielen Dank!

  2. Hi!

    <b>Warning</b>:  Cannot modify header information - headers already sent by (output started at /usr/www/users/xbrtll/download.php:1) in <b>/usr/www/users/xbrtll/download.php</b> on line <b>14</b><br />

    Diese Meldung wurde schon in einer solchen Menge nachgefragt, dass im Prinzip alle Antworten auf Fragen dazu leicht zu finden sein sollten.

    Wenn ich das richtig verstehe, können also die header-Funktionen nichts mehr am Header ändern, weil bereits vorher einer gesendet wurde. Warum aber ist das passiert?

    Die Ausgabe des eigentlichen Inhalte (Content) startete, was dazu führt, dass die Header ausgegeben wurden, denn die müssen vor dem Content gesendet werden.

    Und was kann ich dagegen unternehmen?

    Das Übliche - die vorzeitige Ausgabe verhindern. Was hast du bereits untersucht?

    Lo!