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

Zerberus

Neues Mitglied
Hallo Zusammen.
Ich habe ein Problem mit meinem Website-Projekt.
Es ist ein kleines JS Spiel. Eine PHP-Datei lädt Objekte aus einer MySQL Datenbank und stellt diese per JSON bereit. Dies sieht man hier: www.eggjumper.ch/php/MapLoader.php?id=1


Jede Karte (Map) lädt dann diese JSON Daten per JavaScript werkelt dann mit diesen Daten. Diese JS-Datei wird von jeder MAP geladen. (Beispiel: Map1.htm.php)

Nun ist es so, dass wenn man auf unserem Spiel (www.eggjumper.ch) auf der Spielen-Seite auf eine Karte klickt, die jeweilige Karte aufgerufen werden soll. Um auf die Karte weiterleiten zu können verwenden wir header-location wie folgt:
PHP:
return header("Location: " . $_SERVER['PHP_SELF'] . "?id=map1");

Beim klicken auf eine Karte erscheint oben folgender Fehler:

[][]
Warning: Cannot modify header information - headers already sent by (output started at /home/httpd/vhosts/eggjumper.ch/httpdocs/php/class.spielen.php:28) in /home/httpd/vhosts/eggjumper.ch/httpdocs/php/class.spielen.php on line 32

Dieser Fehler tritt komischerweise nur auf dem externen (öffentlichen) Webserver auf. Zuhause auf dem eigenen Webserver kommt weder ein Fehler noch eine Ausgabe im Header.

Ich verstehe nicht an was das liegen könnte. Könnt ihr mir weiterhelfen?

LG ZERBERUS
 
Werbung:
Ich verstehe nicht an was das liegen könnte.
Dann sollte Google hinzugezogen werden, um die Kausalität (Ursache-Wirkung-Beziehung) dieses Sachverhalts in Erfahrung zu bringen, wenn allem Anschein nach ein unzureichendes Grundlagenwissen es nicht hergibt.

Es hat sich grundsätzlich als hilfreich u. praktikabel bewährt, den Wortlaut der (PHP-/JS-/...-)Fehlermeldung/Warnung Google mitzuteilen - schließlich dürfte man nicht der Erste sein, der sich damit auseinandersetzen darf:
Daraus seien exemplarisch diese drei Links empfohlen/genannt:
  1. http://de2.php.net/manual/de/function.header.php
  2. http://www.vlmedia.de/304/haufiger-php-error-cannot-modify-header-information-headers-already-sent
  3. https://www.arclab.com/en/kb/php/ph...-header-information-headers-already-sent.html
  4. ...
Allgemein/grundsätzlich gilt: Vor header() darf keinerlei Form einer Ausgabe erfolgen. Hierzu zählt auch ein Leerzeichen oder Zeilenumbruch zu Beginn des Codes (vor <?php). Ebenso führt eine Datei, die mit dem Charset "UTF-8 mit BOM" gespeichert wurde, zur selben Serverreaktion, da zu Beginn des Quellcodes ein -je nach Editor(einstellung) nicht-sichtbares- Zeichen eingefügt wird.
Warning: Cannot modify header information - headers already sent by (output started at /home/httpd/vhosts/eggjumper.ch/httpdocs/php/class.spielen.php:28) in /home/httpd/vhosts/eggjumper.ch/httpdocs/php/class.spielen.php on line 32
[...]
Könnt ihr mir weiterhelfen?
Für einen maßgeschneiderten und zielführenden Hinweis/Tipp für Deinen individuellen Anwendungsfall, müssten wir zunächst mal den vollständigen Code von class.spielen.php gesehen haben.
Dieser Fehler tritt komischerweise nur auf dem externen (öffentlichen) Webserver auf. Zuhause auf dem eigenen Webserver kommt weder ein Fehler noch eine Ausgabe im Header.
Daran ist überhaupt nichts komisch (im Sinne von eigenartig, seltsam), sondern lediglich eine Frage der error_reporting-Konfiguration des Servers.

Und dass lokal trotz keiner Fehlermeldung/Warnung dennoch die Ausgabe nicht erfolgt, hätte Dich nachdenklich stimmen sollen/müssen, ob diesbezüglich auf den Servern unterschiedliche Konfigurationen existieren.
 
Vielen Dank für deine Antwort.

Ich habe geprüft wie das error-reporting aussieht. Auf dem Server und lokal genau gleich eingestellt:
Code:
error_reporting=E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT
Habe geprüft wie die Dateien gespeichert sind. Alle utf8 ohne bom, jedenfalls laut notepad++.

Hier die class.htm.php Datei:
PHP:
<?php
require_once("interface.subcontroller.php");
require_once("classes.dbEggJumper.php");
        
class spielen implements subcontroller {
        private $dataBaseEggJumper = null;
        
    public function __construct( $template_path ) {
            $this->params=$_REQUEST;
    }
    public function run()
        {
            if($this->dataBaseEggJumper == null)
            {
                $this->dataBaseEggJumper = new dbEggJumper();
            }
            if(isset($this->params['map1']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map1");
                exit;
                
            }
            else if(isset($this->params['map2']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map2");
                exit;
            }
            else if(isset($this->params['map3']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map3");
                exit;
            }
            else if(isset($this->params['map4']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map4");
                exit;
            }
            else if(isset($this->params['map5']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map5");
                exit;
            }
            else if(isset($this->params['map6']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map6");
                exit;
            }
            else if(isset($this->params['map7']))
            {
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map7");
                exit;
            }
        }

    /*
         * Template ausfuehren
         */
    public function getOutput(){
        include(config::TEMPLATE_PATH."/"."../templates/spielen.htm.php");
        }
        
        

}

?>

Was könnte ich sonst noch versuchen? Habe das ganze Projekt in Netbeans und dort nach 'echo' gesucht, nichts gefunden. Habe auch nach Leerschlägen bei <?php gesucht. Auch nichts verdächtiges...
 
Werbung:
Hier die class.htm.php Datei:
PHP:
<?php
require_once("interface.subcontroller.php");
require_once("classes.dbEggJumper.php");
     
// ...
                return header("Location: ".$_SERVER['PHP_SELF']. "?id=map1");
// ...

?>

PHP: header - Manual schrieb:
Beachten Sie, dass Sie die Funktion header() aufrufen müssen, bevor Sie irgendeine andere Art von Ausgabe (seien es normale HTML-Tags, Leerzeilen in einer Datei oder von PHP) zum Client schicken. Es handelt sich hier um einen typischen Fehler, der zum Beispiel auftritt, wenn Sie Code mittels include oder require oder einer anderen Dateizugriffs-Funktion einlesen, die Leerzeichen oder Leerzeilen enthalten, die ausgegeben werden, bevor header() aufgerufen wird. Das gleiche Problem kann auch auftreten, wenn Sie eine Datei verwenden, in der HTML und PHP vermischt wurden.
PHP:
<html>
<?php
/* Dies wird einen Fehler provozieren. Beachten Sie die vorangehende Ausgabe,
 * die vor dem Aufruf von header() erzeugt wird */
header('Location: http://www.example.com/');
exit;
?>
Zitatquelle: http://de2.php.net/manual/de/function.header.php
 
Beim klicken auf eine Karte erscheint oben folgender Fehler:

[][]
Warning: Cannot modify header information - headers already sent by (output started at /home/httpd/vhosts/eggjumper.ch/httpdocs/php/class.spielen.php:28) in /home/httpd/vhosts/eggjumper.ch/httpdocs/php/class.spielen.php on line 32
Falls es Dir selber (noch) nicht aufgefallen ist: diese Zeilennummer "32" bezieht sich ausschließlich auf "Map 1".

Mit jeder der fünf weiteren klick-/wählbaren Maps steigt die Zeilennummer stetig an. Von "Map 1" zu "Map 2" sind es 9 Zeilen, danach ("Map 2" -> "Map 3", ...) jeweils 8, bis bei "Map 6" Zeile 73 erreicht ist.

Noch Fragen? :cool:

Desweiteren gehört der HTML-Code validiert.

Zeile 3 innerhalb des Dokumentkörpers geht garnicht!
HTML:
   <body>
        <!-- ... -->
        <!DOCTYPE html>
<form name="spielenFormular" action="index.php?id=spielen" method="post" onsubmit='redirect();return false;'>
Dann taucht da im regelmäßigen Turnus ein </a> auf, zu dem jeweils überhaupt kein Pendant <a> existiert.

Und auch am Dokumentende geht's syntaktisch mit den schliessenden </...>-Tags d'runter und d'rüber:
HTML:
</form>
    </body>

    <div class="navbar navbar-inverse navbar-fixed-bottom" role="navigation" style="margin-top: 40px;"></
        <div class="container"> 
            <p class="navbar-text"> &copy;Copyright 2016 by Leon L&uuml;thi, Filip Bosankic & Yannick Heri</p   
        </div>
    </div>
</html>
Zeile 2 gehört unmittelbar vor </html>. Und beachte das "verstümmelte" Ende von Zeile 4 und 6.

Für Umlaute und Co. bedarf es keiner HTML-Entities. Das erledigt UTF-8.
 
Werbung:
Zurück
Oben