Raketenfehlermelder: Internet Exporer, Ersetzen von Fehlermeldungen unterdrücken

Mist. Habe eben nachgeschaut. Der "aktuelle" IE von windows 10 bringt immer noch eigene Fehlermeldungen, wenn man ihm nicht ein halbes K (512 Byte) schickt.

Mit aktiviertem Output-Buffering und PHP klappt es vor dem Ausstieg damit ganz gut:

function preventIEErrorMessages( $z=false ) {
	if ( 512 > ob_get_length() ) {
		if (false === $z ) {
			$z = 512 - 75 - ob_get_length();
		}
		$s = str_repeat( '-', $z );
		echo '<!-- This will prevent IE-users to show microsofts own error messages. ' . $s . ' -->';
	}
}

75 ist die Zeihenanzahl des Kommentars

Gibt es dagegen etwas einzuwenden?

  1. Nurmalso nebenbei gefragt: Ist false ein passender Default für einen Integer? MFG

    1. Nurmalso nebenbei gefragt: Ist false ein passender Default für einen Integer?

      Nun, ich mache den Vergleich if (false === $z ) nicht grundlos typsicher… Aber sonst wäre es ziemlich unpassend. Eigentlich stellt sich viel mehr die Frage, warum ich überhaupt die Übergabe eines Wertes ermögliche. Sowas kommt wohl davon, wenn man ohne Plan programmiert.

      1. Nurmalso nebenbei gefragt: Ist false ein passender Default für einen Integer?

        Nun, ich mache den Vergleich if (false === $z ) nicht grundlos typsicher…

        Typsicher heißt daß man bei den Typen bleibt die man deklariert hat. Und so wie es aussieht wäre $z bei Dir kein bool sondern ein integer. Wenn man hier überhaupt die Typisierung ins Spiel bringen sollte.

        Was den IE betrifft: Wie verhält der sich denn wenn er bei einem Status != 200 einen Content mit Length < 512 bekommt? Hast Du das mal getestet?

        MFG

        1. Was den IE betrifft: Wie verhält der sich denn wenn er bei einem Status != 200 einen Content mit Length < 512 bekommt? Hast Du das mal getestet?

          Getestet bzw. „nur fast freiwillig“ gesehen habe ich: 403, 404, 500:

          Der IE unterdrückt meine Fehlermeldung, zeigt sein sybillisches Zeug.

          1. Danke Dir für die Info. Ich kann das z.Z. nicht selber testen.

            Schönen Sonntag

            1. Danke Dir für die Info. Ich kann das z.Z. nicht selber testen.

              Hm. Wenn Du das Ergebnis mit weiteren Statuscodes brauchst, dann teste ich die gerne durch, ist ja schnell gemacht:

              <html>
              <?=http_response_code( intval( $_GET['status'] ) ); ?>
              <h1>Error <?=intval( $_GET['status'] ); ?></h1>
              </html>
              

              Schönen Sonntag

              Nunja. Ich hoffe, Du gern, was Du tust.

              1. Danke Dir für die Info. Ich kann das z.Z. nicht selber testen.

                Hm. Wenn Du das Ergebnis mit weiteren Statuscodes brauchst, dann teste ich die gerne durch, ist ja schnell gemacht:

                <html>
                <?=http_response_code( intval( $_GET['status'] ) ); ?>
                <h1>Error <?=intval( $_GET['status'] ); ?></h1>
                </html>
                

                Nun ich meinte den HTTP-Status. MFG

                1. Nun ich meinte den HTTP-Status.

                  Klar. Handbuch. Das gezeigte Skriptlein setzt ihn also.

  2. Hallo,

    Mist. Habe eben nachgeschaut. Der "aktuelle" IE von windows 10 bringt immer noch eigene Fehlermeldungen, wenn man ihm nicht ein halbes K (512 Byte) schickt.

    das ist aber AFAIR schon seit IE4 einstellbar. Die Option lautet "Kurze HTTP-Fehlermeldungen anzeigen". Dort ein Häkchen zu setzen ist IMO sauberer als serverseitig zu tricksen, um auf die 512 Byte zu kommen.

    Mit aktiviertem Output-Buffering und PHP klappt es vor dem Ausstieg damit ganz gut:

    function preventIEErrorMessages( $z=false ) {
    	if ( 512 > ob_get_length() ) {
    		if (false === $z ) {
    			$z = 512 - 75 - ob_get_length();
    		}
    		$s = str_repeat( '-', $z );
    		echo '<!-- This will prevent IE-users to show microsofts own error messages. ' . $s . ' -->';
    	}
    }
    

    Warum so umständlich? Schreib einen ausreichend "fetten" HTML-Kommentar ins Error-Dokument und gut is'.

    Ciao,
     Martin

    --
    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
    1. Hi,

      das ist aber AFAIR schon seit IE4 einstellbar. Die Option lautet "Kurze HTTP-Fehlermeldungen anzeigen". Dort ein Häkchen zu setzen ist IMO sauberer als serverseitig zu tricksen, um auf die 512 Byte zu kommen.

      Und wie setzt Du dieses Häkchen in den Browsern Deiner Seiten-Besucher?

      Warum so umständlich? Schreib einen ausreichend "fetten" HTML-Kommentar ins Error-Dokument und gut is'.

      Dem kann ich nur zustimmen. Einfach ohne zu gucken, ob schon die 512 Zeichen erreicht sind, ein paar Hundert Zeichen mitschicken.

      cu,
      Andreas a/k/a MudGuard

      1. Hallo,

        das ist aber AFAIR schon seit IE4 einstellbar. Die Option lautet "Kurze HTTP-Fehlermeldungen anzeigen". Dort ein Häkchen zu setzen ist IMO sauberer als serverseitig zu tricksen, um auf die 512 Byte zu kommen.

        Und wie setzt Du dieses Häkchen in den Browsern Deiner Seiten-Besucher?

        die Browser meiner Besucher sind doch gar nicht relevant. Eigentlich sollte bei denen gar keine HTTP-Fehlermeldung auftreten; wenn doch, darf sie aber ruhig so aussehen, wie es die Nutzer gewöhnt sind. Nützen tut's ihnen sowieso nicht.

        Ich gehe von den Browsern aus, die der Entwickler zum Testen seines Werks benutzt.

        Ciao,
         Martin

        --
        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
        1. Eigentlich sollte bei denen gar keine HTTP-Fehlermeldung auftreten; wenn doch, darf sie aber ruhig so aussehen, wie es die Nutzer gewöhnt sind.

          Naja. Ich will denen schon was mitteilen. Nur halt nicht zu viel. Das bleibt regelmäßig unter 512 Bytes.

          Freilich: Wenn ich die Fehlermeldungen mit HTML und CSS aufhübsche, dann wird die Funktion und deren Aufruf schnell obsolet.

          Insoweit habt Ihr natürlich damit recht:

          Einfach ohne zu gucken, ob schon die 512 Zeichen erreicht sind, ein paar Hundert Zeichen mitschicken.

          Andererseits ist PHP "eh angeworfen" und da habe ich mir gedacht "Schickst halt genau 512 Byte..."

      2. Und wie setzt Du dieses Häkchen in den Browsern Deiner Seiten-Besucher?

        Hatte fast gehofft, dass es genau dafür einen Tipp gibt. Irgend eine Nachricht in den HTTP-Headern (außer Status 200 natürlich).

  3. Hallo Jörg,

    einerseits: danke für diese Info. Das wusste ich bisher nicht.

    Das API der Funktion sieht so aus:

    • übergibst Du keinen Parameter, ist er per Default FALSE und die Funktion berechnet die Anzahl der benötigten Füll-Minus
    • übergibst Du eine Zahl, wird diese als Wiederholfaktor für das "-" genutzt.

    Du hast nach möglichen Einwänden gefragt, darum liste ich mal Möglichkeiten auf.

    • Wo ist der Usecase, überhaupt einen Parameter zu übergeben?
    • Würdest Du 0 oder -1 als Default verwenden, könntest Du PHP 7 Typdeklarationen für den Parameter verwenden
    • Die magische Konstante 75 kann man vermeiden, siehe unten
    • Es gibt eine Logiklücke: enthält der Outputbuffer 438 bis 511 Bytes, berechnest Du einen negativen Bedarf an Minuszeichen und str_repeat wirft eine Warnung. D.h. den str_repeat solltest Du nur machen wenn $z>0 ist.

    Ich würde es so schreiben:

    function preventIEErrorMessages( int $z=-1 ) {
      if ( ob_get_length() >= 511 )
        return;
    
      $s = '<!-- This will prevent IE-users to show microsofts own error messages. ';
      if ($z < 0 ) {
        $z = 512 - strlen($s) - 4 - ob_get_length();
      }
      if ($z > 0) {
        $s .= str_repeat( '-', $z );
      }
      echo $s . ' -->';
    }
    

    Warum der return statt eines if-Blocks? Der return ist eine Form von goto und darum unstrukturiert, unnötige Schachtelung ist aber ebenfalls ärgerlich. Und es ist guter Brauch, zu Beginn eine Funktion zu fragen, ob ihre Nutzung unnötig ist oder Parameter falsch sind, und dann sofort auszusteigen. Das entkoppelt Eingangsprüfungen vom regulären Code der Funktion.

    • Oder gar nicht: Muss es ein Kommentar sein, um den Zweck zu erfüllen? Du musst dich beim Nutzer deiner Seite ja nicht für das Padding rechtfertigen. Dann würden 512-ob_get_length() Spaces reichen und Du würdest mit der Längenrechnung nicht in der Bredouille landen. Es gibt schönere Gegenden in Frankreich…

    Wie gesagt - das sind Vorschläge. Es ist meine Meinung, es ist mein Stil zu programmieren. Nutze davon, was Du für gut hältst.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Du musst dich beim Nutzer deiner Seite ja nicht für das Padding rechtfertigen

      Hm. Ja. Warum auf den armen IE-Benutzern rumhacken…

      Ich hab mir auch die übrigen Tips zu Herzen genommen und das Machwerk auf folgende Zeilen eingedampft:

      function preventIEErrorMessages( ) {
      	if ( 0 < $l = 512 - ob_get_length() ) {
      		echo str_repeat( ' ', $l );
      	}
      }
      

      Es gibt schönere Gegenden in Frankreich…

      Mois, je sais…

  4. @@Raketenfehlermelder

    Gibt es dagegen etwas einzuwenden?

    Ja. Multiple - in Kommentaren sollte man vermeiden.

    BTW, AFAIS war das meine allererste Frage (der erste von mir eröffnete Thread) hier im Forum.

    LLAP 🖖

    --
    Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
    1. Eine offene Meldung an den Besucher macht einen im HTML eingebauten Kommentar ohnehin überflüssig.

      MFG

    2. Hallo Gunnar,

      BTW, AFAIS war das meine allererste Frage (der erste von mir eröffnete Thread) hier im Forum.

      wie doch die Zeit vergeht ...

      Und guck nochmal hin: Damals hast du dich mit keinem Wort für die Antwort bzw. die sich entwickelnde Diskussion bedankt. Warst einer von denen, die eine Frage stellen und sich dann im Thread nicht mehr blicken lassen.
      Genau das, worüber wir uns heute manchmal ärgern. ;-)

      Schönen Sonntag,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. @@Der Martin

        Und guck nochmal hin: Damals hast du dich mit keinem Wort für die Antwort bzw. die sich entwickelnde Diskussion bedankt. Warst einer von denen, die eine Frage stellen und sich dann im Thread nicht mehr blicken lassen.

        Hm, damals gab’s diese +/−-Dinger[1] noch nicht. 😈

        Dann will ich das an dieser Stelle mal nachholen. Vielen Dank an @MudGuard – für alles. Er ist einer von denen, von denen[2] ich in meinen Anfangstagen viel gelernt habe.

        LLAP 🖖

        --
        Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.

        1. Ihr seht den Unterschied zwischen Minuszeichen und Bindestrich? ↩︎

        2. Das schreit nach Lektorat. ↩︎

        1. Hallo Gunnar,

          Er ist einer von denen, von denen[2] ich in meinen Anfangstagen viel gelernt habe.

          Lektoratsvorschlag:

          • Er ist einer derjenigen, von denen ich in meinen Anfangstagen viel gelernt habe.
          • Er ist einer von denen, die mich in meinen Anfangstagen viel gelehrt haben.
          • Von ihm habe ich in meinen Anfangstagen viel gelernt.

          Einem Dankeschön in dieser Art schließe ich mich gerne an, an alle Stammposter hier 😀

          Rolf

          --
          sumpsi - posui - obstruxi
          1. Hallo Rolf B,

            "Er lehrte mich." und "Ich lernte von ihm." sind nicht beliebig austauschbar. 🤪

            Bis demnächst
            Matthias

            --
            Du kannst das Projekt SELFHTML unterstützen,
            indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
            1. Hallo Matthias,

              "Er lehrte mich." und "Ich lernte von ihm." sind nicht beliebig austauschbar. 🤪

              stimmt, der Unterschied zwischen beiden besteht im Erfolg.

              Ciao,
               Martin

              --
              Vater zum Sohn: Dein Studium war nicht kostenlos, aber umsonst!
              1. Hi,

                "Er lehrte mich." und "Ich lernte von ihm." sind nicht beliebig austauschbar. 🤪

                stimmt, der Unterschied zwischen beiden besteht im Erfolg.

                nicht nur das - man kann auch von jemandem lernen, ohne daß derjenige lehrt.

                cu,
                Andreas a/k/a MudGuard

    3. Ja. Multiple - in Kommentaren sollte man vermeiden.

      Innerhalb eines SGML-Konstruktes (das mit <! beginnt und mit > endet,

      schaltet die Zeichenfolge -- zwischen nicht-Kommentar und Kommentar um.

      Ohem. So alt und doch so neu. Oder andersrum.

      Wie auch immer: Obwohl meine laienhaften Versuche, das Problem zu provozieren und im gerenderten Ergebnis sichtbar zu machen sowohl beim einzeiligen Kommentar wie auch beim ursprünglichen verwendeten mehrzeiligen Kommentar scheiterten (vermutlich am Browser oder an der Angabe einer passenden HTML-Version), bin ich froh, dass ich bei Eindampfen ohnehin Leerzeichen genommen habe.

      Interessant ist auch, dass ich endlich mal erfahre, woher denn das oft gesehene und bis heute manchmal grundlos so auftauchende Kommentarende '//-->' stammt.