Maede: Cannot modify header information - headers already sent by

Hallo

Ich habe mich bereits über dieses Problem (Cannot modify header information - headers already sent by(output started at ../delete.php:10) in ../delete.php on line 53) informiert und habe diverse Tipps ausprobiert und doch hat nichts genützt.

Code:

  
[..]  
<h3>Sanibilder l&ouml;schen (<a href="*zensiert*" target="_blank">Sanibilder ansehen</a>)</h3>  
<form action="delete.php" method="post">  
<select name="file_sani" size="1">  
 <option selected></option>  
   <?php  
   if ($handle = opendir("*zensiert*")) {  
     while (false != ($file = readdir($handle))) {  
       if ($file != "." && $file != ".." && !stristr($file,".php") && !stristr($file,".html") && !stristr($file,".htaccess")) {  
         echo "<option>$file</option>";  
       }  
     }  
   closedir($handle);  
   }  
 ?>  
</select>  
<input type="submit" name="delete_sani" value="Diese Datei l&ouml;schen">  
</form>  
<?php  
ob_start();  
 if (isset($_POST["delete_sani"]) && !empty($_POST["delete_sani"])) {  
 $delete = "*zensiert*" . $_POST["file_sani"];  
   unlink($delete);  
   header("Location: $PHP_SELF");  
   ob_end_flush();  
 }  
?>  
<hr>  
[..]  

Ich habe nach Leerzeichen ausschau gehalten, habe den ob_end_clean(); eingesetzt und doch hat nichts genützt, kann mir jemand helfen, danke.

mfg: Maede

  1. Hello,

    [...viel Code...]
    <?php

    fällt dir irgendwas auf? Du hast schon unmengen an HTML an den Browser geschickt, eh dein PHP-Code überhaupt beginnt - da ist es auf jeden Fall zu spät noch Header zu verschicken. Wenn du den Header erst so spät festlegen kannst, musst du das output-buffering weitaus früher starten...  
      
    MfG  
    Rouven  
    
    -- 
    \-------------------  
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))  
      
    Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
    
    1. musst du das output-buffering weitaus früher starten...

      Das habe ich bereits gemacht aber gebracht hat es nichts.

      mfg: Maede

  2. Hallo

    »» <?php  
    
    > ob_start();  
    >  if (isset($_POST["delete_sani"]) && !empty($_POST["delete_sani"])) {  
    >  $delete = "*zensiert*" . $_POST["file_sani"];  
    >    unlink($delete);  
    >    header("Location: $PHP_SELF");  
    >    ob_end_flush();  
    >  }  
    > ?>
    
    

    Dass zu diesem Zeitpunkt (nach dem hier gezeigten Code zu urteilen) schon jede Menge Ausgabecode zum Browser übermittelt wurde und es deshalb zu spät zum senden von Headern ist, wurde dir ja schon gesagt.

    Wenn du schon mit dem Ausgabepuffer arbeitest (ob_start, ob_end_flush), muss das Starten des Ausgabepuffers auch *vor jeglicher* Ausgabe an den Browser stattfinden, also gaaaaaanz oben am Anfang des Skripts. Meist ist das aber unnötig, wenn man sich an das EVA-Prinzip hält. Also zuerst die Eingaben prüfen, dann selbige verarbeiten (dabei eventuell entscheiden, ob man irgendwohin weiterleitet) und erst dann mit den dabei ermittelten Daten die Ausgabe tätigen.

    Ach, und noch zwei Sachen:

    1. header("Location: ..."); erwartet eine *vollständige* URL mit Protokollangabe etc. pp.. Auch wenn die meisten Browser eine relative Angabe wie die deine selbst ergänzen kann man sich darauf nicht verlassen. Es könnte sein, dass dein Skript deshalb nicht so funktioniert, wie du es wünschst.

    2. $PHP_SELF ist einerseits nicht sicher und andererseits in dieser Schreibweise veraltet. Benutze stattdessen $_SERVER["SCRIPT_NAME"], dies allerdings *nicht* bei header("Location: ..."); (wegen der nicht vollständigen URL). Zum Beispiel mit "http://".$_SERVER["HTTP_HOST"]."/".$_SERVER$_SERVER["SCRIPT_NAME"] kannst du dir die vollständige URL der derzeit geladenen Seite zurückgeben lassen. Je nach Konfiguration des Servers kann dieser Wert auch aus *einer* Servervariable generiert werden. Welche dir zur Verfügung stehen zeigt dir die Ausgabe von phpinfo.

    Schreibe <?php phpinfo(); ?> in eine eigene Datei, übertrage diese auf den Server und rufe sie im Browser auf. Recht weit unten findest du im Abschnitt "PHP Variables" alles, was dir der Server über PHP zur Verfügung stellt. Zu nutzen sind diese Variablen durch das Voranstellen von "$", aus dem _SERVER["SCRIPT_NAME"] der Auflistung wird also $_SERVER["SCRIPT_NAME"] im Anwendungsfall.

    Tschö, Auge

    --
    Die deutschen Interessen werden am Liechtenstein verteidigt.
    Veranstaltungsdatenbank Vdb 0.2
    1. Hallo

      ... "http://".$_SERVER["HTTP_HOST"]."/".$_SERVER["SCRIPT_NAME"] ...

      ... ist natürlich falsch, da $_SERVER["SCRIPT_NAME"] selbst den führenden Slash beinhaltet.

      Richtig: "http://".$_SERVER["HTTP_HOST"].$_SERVER["SCRIPT_NAME"]

      Wie gesagt kann es aber sein, dass auf deinem Server eine vollständige Skript-URL im Array $_SERVER zur Verfügung steht.

      Tschö, Auge

      --
      Die deutschen Interessen werden am Liechtenstein verteidigt.
      Veranstaltungsdatenbank Vdb 0.2
  3. ok, es hat funktioniert, ich habe es mit der Variante von auge probiert und es hat geklapt, danke an alle.

    mfg: Maede