Eric: Aufruf einer CSS-Datei funktioniert nicht

Hi,

der Aufruf

echo <<<TXT
<link rel="stylesheet" type="text/css" href="/CSSlib/engl.css">
TXT;

funktioniert einwandfrei.

Der Aufruf

echo <<<TXT
<link rel="stylesheet" type="text/css" href="/CSSLib/$_SERVER['Lay_e'].css">
TXT;

führt allerdings zu dem Fehler

Fehlercode: 500 Internal Server Error

$_SERVER['Lay_e'] enthält den korrekten Wert 'engl'.

Ich habe schon zig Varianten versucht: href="CSSLib/" . $_SERVER['Lay_e'] . ". CSS">

u.a.

Anm.: Das Einfügen in <<<TXT .....TXT; wegen mehrerer (korrekter) Statements.

akzeptierte Antworten

  1. Hi,

    prinzipiell: für clientseitige Probleme ist serverseitiger Code wenig hilfreich.

    echo <<<TXT
    <link rel="stylesheet" type="text/css" href="/CSSlib/engl.css">
    <link rel="stylesheet" type="text/css" href="/CSSLib/$_SERVER['Lay_e'].css">
    TXT;
    

    Groß vs. klein …

    cu,
    Andreas a/k/a MudGuard

    1. Hi,>

      Groß vs. klein …

      Der Schreibfehler ist bei der Anonymisierung meiner Daten passiert. Dieser Fehler führt aber nicht zum Abbruch, wie ich gerade getestet habe. Es muss also etwas anderes faul sein.

  2. Hallo Eric,

    Link zum Handbuch: String-Interpolation in PHP

    Konkreter Fehler: Du verwendest die einfache Syntax (oder basic syntax). Die unterstützt zwar Arrayzugriffe mit String-Keys, aber da diese Syntax uralt ist, basiert sie auf uralter Array-Notation ohne Hochkommas:

    Falsch:

    ... href="/CSSLib/$_SERVER['Lay_e'].css"
    

    Richtig:

    ... href="/CSSLib/$_SERVER[Lay_e].css"
    

    In den eckigen Klammern darf stehen:

    • Ein Name
    • Eine Variable (also "foo{$arr[$i]}" ist ok)
    • Eine Zahl

    Ein Name muss dem Muster [a-zA-Z_\x80-\xff][a-zA-Z0-9_\x80-\xff]* entsprechen, erlaubt sind im Namen also ASCII-Buchstaben, ASCII-Ziffern (außer am Anfang), ein Unterstrich und die Zeichen mit dem Code 0x80 bis 0xff. Falls Du PHP-Code in UTF-8 speicherst, sollten auch alle Unicode-Zeichen erlaubt sein, weil die in UTF8 als 2 oder mehr Bytes mit Codes von 0x80 bis 0xFF codiert werden.

    Alternativ kannst Du auch die erweiterte Interpolationssyntax mit geschweiften Klammern wählen, dann MUSS ein Array-Key in Anführungszeichen stehen:

    Auch richtig:

    ... href="/CSSLib/{$_SERVER['Lay_e']}.css"
    

    Hinweis dazu, warum href="CSSLib/" . $_SERVER['Lay_e'] . ". CSS"> nicht funktioniert: Wenn Du Dich in einem Heredoc-String befindest (also diese <<< Notation), kannst Du nicht eben mal mit dem Punkt-Operator Strings verketten. Der Heredoc-String ist ja nicht beendet, er nimmt den Punkt deshalb als String-Inhalt. Was Du hättest machen können: $_SERVER['Lay_e'] in einer normalen Variablen speichern und diese dann mit normaler String-Interpolation einsetzen.

    $language = $_SERVER['Lay_e'];
    echo <<<END
    <link rel="stylesheet" href="/CSSLib/$language.css">
    END;
    

    Die Diskussion darüber, HTML-Code mit ECHO auszugeben, ist mir zwar eigentlich leid, aber ich persönlich finde es ganz schlecht. Moderner Code sieht aus meiner Sicht eher so aus:

    function renderPage() {
       $foo = 1;    // Irgendwelche Initialisierungen
       $bar = 2;
    ?>
    <!doctype html>
    <html lang="de">
    <head>
       <title>Demo</title>
       ...weitere nötige head-Einträge...
       <link rel="stylesheet" href="/CSSLib/<?= $_SERVER['Lay_e'] ?>">
       <link rel="stylesheet" href="/CSSLib/<?= $_SERVER['Hai_o'] ?>">
       <link rel="stylesheet" href="/CSSLib/<?= $_SERVER['Hui_Buh'] ?>">
       ...und so weiter...
    </head>
    <body>
    <?php renderBody() ?>
    </body>
    </html>
    <?php
    }   // Ende von render()
    

    Ob man das in Funktionen packt und die Body-Ausgabe in eine weitere Funktion auslagert, ist Geschmackssache und hängt auch von der Komplexität der Seite ab.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Hi Rolf,

      vielen Dank für die ausführliche Erläuterung. jetzt habe ich noch eine Nachfrage.

      Nehmen wir folgende Struktur an:

      $_SERVER["DOCUMENT_ROOT"]/test/CSSlib/
      $_SERVER["DOCUMENT_ROOT"]/test/en/index.html
      

      In index.html steht der Link

      <link rel="stylesheet" type="text/css" href="/CSSlib/norm_en.css">
      

      Da würde ja wohl CSSlib direkt unter der Root gesucht.

      Wie kann ich auf das darüberliegende Verzeichnis zugreifen?

      Ganz im Hinterstübchen habe ich '../' in Erinnerung, aber wohin?

      1. Hallo Eric,

        Wie kann ich auf das darüberliegende Verzeichnis zugreifen?

        Mit .. - so wie Du sagst. Die Pfadkomponente .. besagt: der Elternordner desjenigen Ordners, bei dem ich im Pfad gerade angekommen bin. Zu Beginn ist es das aktuelle Verzeichnis.

        Beim Zugriff auf Ressourcen (CSS oder JS) aus der HTML-Datei ist das "aktuelle Verzeichnis" immer der URL-Pfad, über den die HTML Datei geladen wird. Also /test/en.

        Mit href="../CSSLib/norm_en.css" gehst Du von da aus eins hoch und bist in /test, und von da aus hinab nach CSSLib.

        Wenn Du deine Webseite nicht unter /, sondern in einem Unterverzeichnis der URL liegen hast, ist es immer knifflig, das korrekt zu steuern.

        Rolf

        --
        sumpsi - posui - obstruxi
      2. Lieber Eric,

        $_SERVER["DOCUMENT_ROOT"]/test/CSSlib/
        $_SERVER["DOCUMENT_ROOT"]/test/en/index.html
        
        <link rel="stylesheet" type="text/css" href="/CSSlib/norm_en.css">
        

        warum ist das so? Warum heißt der Pfad nicht en/CSSlib/norm.css?

        $_SERVER["DOCUMENT_ROOT"]/test/en/CSSlib/norm.css
        $_SERVER["DOCUMENT_ROOT"]/test/en/index.html
        

        So könnte man in den HTML-Dokumenten einen relativen Pfad dieser Art bauen:

        <link rel="stylesheet" type="text/css" href="../CSSlib/norm.css">
        

        Liebe Grüße

        Felix Riesterer

  3. Moin Eric,

    Der Aufruf

    echo <<<TXT
    <link rel="stylesheet" type="text/css" href="/CSSLib/$_SERVER['Lay_e'].css">
    TXT;
    

    führt allerdings zu dem Fehler

    Fehlercode: 500 Internal Server Error

    $_SERVER['Lay_e'] enthält den korrekten Wert 'engl'.

    sofern Du Zugriff auf die error log des Servers hast, kannst Du auch dort nachschauen, denn PHP meldet dort aufgetretene Fehler – Syntax, Ressourcenzugriffe, ….

    In Deinem Fall wäre dort die Meldung über einen entsprechenden Syntaxfehler zu finden.

    Viele Grüße
    Robert

    1. Leider habe ich keinen Zugriff auf eine Log-Datei 😞

      1. Hallo Eric,

        dann hast Du einen schlechten Hoster oder hast Dich noch nicht gründlich auf der Verwaltungsseite deines Webs umgeschaut. Zugriff auf die Log-Files von PHP und Webserver ist eigentlich Pflicht.

        Rolf

        --
        sumpsi - posui - obstruxi