Simon P.: Innerhalb von php-while-schleife datensatz mit javascritp

0 78

Innerhalb von php-while-schleife datensatz mit javascritp

Simon P.
  • datenbank
  1. 0
    Felix Riesterer
    1. 0
      Simon P.
      1. 0
        Simon P.
        1. 0
          Felix Riesterer
          1. 0
            Simon P.
            1. 0
              Felix Riesterer
              1. 0
                Simon P.
                1. 0
                  Felix Riesterer
                  1. 0
                    Simon P.
                    1. 0
                      Felix Riesterer
                      1. 0
                        Simon P.
                        1. 0
                          Felix Riesterer
                          1. 0
                            Simon P.
                            1. 0
                              Simon P.
                              1. 0
                                Felix Riesterer
                                1. 0
                                  Simon P.
                                  1. 0
                                    Felix Riesterer
                                    1. 0
                                      Simon P.
                                      1. 0
                                        Simon P.
                                        1. 0
                                          Auge
                                          1. 0
                                            Simon P.
                                            1. 0
                                              Felix Riesterer
                                              1. 0
                                                Simon P.
                                            2. 0
                                              Martin_Online
                                              1. 0
                                                Felix Riesterer
                                                1. 0
                                                  Martin_Online
                                                  1. 0
                                                    M.
                                                    1. 0
                                                      Simon P.
                                            3. 0
                                              M.
                                        2. 0
                                          Felix Riesterer
                                          1. 0
                                            Simon P.
                                            1. 0
                                              Felix Riesterer
                                              1. 0
                                                Simon P.
                                                1. 0
                                                  Felix Riesterer
                                                  1. 0
                                                    Simon P.
                                                    1. 0
                                                      Simon P.
                                                    2. 0
                                                      Felix Riesterer
                                                      1. 0
                                                        Simon P.
                                                        1. 0
                                                          Felix Riesterer
                                                          1. 0
                                                            Simon P.
                                                            1. 0
                                                              Felix Riesterer
                                                              1. 0
                                                                Simon P.
                                                                1. 0
                                                                  Simon P.
                                                                  1. 0
                                                                    Felix Riesterer
                                                                    1. 0
                                                                      Simon P.
                                                                      1. 0
                                                                        Simon P.
                                                                        1. 0

                                                                          HTML5-Semantik

                                                                          Felix Riesterer
                                                                          • html
                                                                          1. 0
                                                                            Simon P.
                                                                            1. 0
                                                                              Felix Riesterer
                                                                              1. 0
                                                                                Simon P.
                                                                                1. 0
                                                                                  Felix Riesterer
                                                                                  1. 0
                                                                                    Simon P.
                                                                                    1. 0
                                                                                      Felix Riesterer
                                                                                      1. 0
                                                                                        Simon P.
                                                                                        1. 0
                                                                                          Simon P.
                2. 0
                  Simon P.
                  1. 1
                    Felix Riesterer
                    1. 0
                      Simon P.
                      1. 0
                        M.
                        1. 0
                          Matthias Apsel
                          1. 0
                            M.
                            1. 0
                              molily
                              1. 0
                                M.
                      2. 0
                        Felix Riesterer
                        1. 0
                          Simon P.
                          1. 0

                            Begriff Webseite

                            Tabellenkalk
                            • projektverwaltung
                            1. 0
                              Simon P.
                              1. 0
                                Gunnar Bittersmann
                          2. 0
                            Auge
      2. 0
        Felix Riesterer
        1. 1
          Matthias Apsel
          1. 0
            Felix Riesterer
            1. 0

              Browserverlauf bei seiteninternen Verweisen löschen

              Matthias Apsel
              • selfhtml-wiki
              1. 0
                Felix Riesterer
                1. 0
                  molily
              2. 0
                molily
  2. 0
    ChrisB

Hallo Leute, ich schon wieder -.-
mich selbst ärgert das, dass ich immer fragen muss, aber wenn ich den ganzen Tag mit einem Problem verbringe und doch zu keiner Lösung mehr komme, weil (wie es scheint) noch niemand das brauchte, dann muss ich wohl doch mal nachfragen:
Undzwar habe ich eine Datenbank über mySQL angelegt, habe die Daten auch schon alle auslesen können. Nun möchte ich diese Daten ordentlich formatiert in meine Webside bringen. Dazu habe ich eine Allgemeine Frage und eine spezielle für mein Problem.
1. Allgemeine Frage:
   Die Datensätze die ich mit Hilfe der "while-schleife" auslese, kann ich doch nur innerhalb dieser schleife anpassen, da ich doch sonst (wenn ich die Datensätze einzelnd ansprechen würde) keine Datenbank mehr bräuchte. Wie kann ich also innerhalb meiner PHP-Schleife, die Datensätze mit hilfe css bzw. html ansprechen?
2. Nun zu meinem speziellen Fall:
   Ich möchte ein Feld aus meinen Datensätzen z.B. Name auslesen und in eine auflistung packen. Darunter möchte ich die restlichen Felder von diesem Datensatz in einem Div, was ich mir mithilfe eines Javascriptes per klick ein und ausblenden lasse kann, ausgeben lassen. Hier ein Versuch von mir:
<?php
include("login.php");
?>
<script language="javascript" type="text/javascript" src="einblenden_ausblenden.js"></script>
<?php
$result = mysqli_query($db, "SELECT Name, ID FROM datenbank");
while($row = mysqli_fetch_object($result))
{
echo
'<li>' ."$row->Name". '</li>' ?>
<p>
<a href="#" onclick="toggleElementDisplay("box");">Click me!</a>
<div id="box" style="border: 1px solid #000000; display: none;">'
     <?php
     echo "$row->ID";
     ?>
</div>
</p>
<?php
}
?>

Wenn man das sich mal so ausgeben lässt, dann sieht das schon ganz gut aus... aber wenn ich auf "Click me!" drücke passiert einfach garnichts, außer das sich hinter der Url ein "#" rangesetzt hat.
Also wie könnte es funktionieren?
Vielen Dank schonmal im Vorraus!

  1. Lieber Simon P.,

    es wäre sinnvoll, die weiteren Angaben innerhalb Deines <li>-Elements zu verpacken. Mit CSS (und völlig ohne JavaScript) kannst Du dann die :hover-Pseudoklasse nutzen, um diese Zusatzinformationen anzeigen zu lassen.

    1. Allgemeine Frage:
         Die Datensätze die ich mit Hilfe der "while-schleife" auslese, kann ich doch nur innerhalb dieser schleife anpassen, da ich doch sonst (wenn ich die Datensätze einzelnd ansprechen würde) keine Datenbank mehr bräuchte.

    Es wäre auch möglich innerhalb der Schleife die Daten in ein Array zu schreiben und anschließend dieses in einer anderen Schleife zu verarbeiten. Das macht man wohl, wenn man die Datenstruktur (DB) von der Präsentation (HTML) abstrahieren will, und das Array einfach einer Template-Maschine in den Rachen wirft. Für Deinen Anwendungsfall sieht es aber tatsächlich so aus, als wäre es beim Abfragen der Datenbank am geschicktesten, das Markup gleich zu generieren.

    Wie kann ich also innerhalb meiner PHP-Schleife, die Datensätze mit hilfe css bzw. html ansprechen?

    Du kannst Markup (HTML-Code) generieren, um es an den Browser zu senden. CSS und JavaScript erledigt dann der Browser. Da kann PHP sinnvollerweise nicht "mitreden".

    1. Nun zu meinem speziellen Fall:
      echo
      '<li>' ."$row->Name". '</li>' ?>
      <p>
      <a href="#" onclick="toggleElementDisplay("box");">Click me!</a>
      <div id="box" style="border: 1px solid #000000; display: none;">'
           <?php
           echo "$row->ID";
           ?>
      </div>
      </p>

    Das bedeutet, dass Dein Dokument im Mittelteil etwa so aussieht?

    <ul>  
        <li>Name 1</li>  
        <p>  
            <a href="#" onclick="toggleElementDisplay("box");">Click me!</a>  
            <div id="box" style="border: 1px solid #000000; display: none;">  
                ID 1  
            </div>  
        </p>  
        <li>Name 2</li>  
        <p>  
            <a href="#" onclick="toggleElementDisplay("box");">Click me!</a>  
            <div id="box" style="border: 1px solid #000000; display: none;">  
                ID 2  
            </div>  
        </p>  
        <li>Name 3</li>  
        <p>  
            <a href="#" onclick="toggleElementDisplay("box");">Click me!</a>  
            <div id="box" style="border: 1px solid #000000; display: none;">  
                ID 3  
            </div>  
        </p>  
    </ul>
    

    Da stellen sich mir die Haare zu Berge! Du erzeugst ungültiges Markup!

    1.) <ul>- und <ol>-Elemente dürfen ausschließlich <li>-Elemente als Kindelemente haben, keinesfalls jedoch <p>-Elemente!

    2.) Es ist nicht sinnvoll, innerhalb eines <p>-Elementes ein (oder mehrere) <div>-Element(e) zu verwenden. Besser <span>, <em>, <strong> oder <b>/<i>, denn in einem <p>-Element sollten laut Sezifikation (soweit ich mich erinnere) nur inline-Elemente stehen.

    3.) Eine ID darf dokumentweit nur ein einziges Mal vorkommen. Du aber verwendest die ID "box" mehrfach. Das ist entgegen der Spezifikation!

    4.) Dein Markup enthält nicht nur Markup (HTML), sondern auch JavaScript (alles mit dem "onclick"-Attribut zusammenhängende) und CSS ("style"-Attribut). Das solltest Du unbedingt als "schlechten Stil" vermeiden!

    Besser so:

    <ul id="boxes">  
        <li>  
            Name 1  
            <span>ID 1</span>  
        </li>  
        <li>  
            Name 2  
            <span>ID 2</span>  
        </li>  
        <li>  
            Name 3  
            <span>ID 3</span>  
        </li>  
    </ul>
    

    Dein CSS sollte dann folgendes enthalten:

    #boxes li span{  
        display: none;  
    }  
      
    #boxes li:hover span {  
        display: block;  
        position: absolute;  
    }
    

    Du kannst natürlich noch viel mehr an Eigenschaften definieren, aber mit diesen beiden Rulesets erhältst Du den Hover-Effekt völlig ohne JavaScript.

    5.) <a href="#" onclick="toggleElementDisplay("box");">Click me!</a> ist kaputter Code, da der Attributwert für "onclick" nach der öffnenden runden Klammer zuende ist. das "box" wäre schon der Name des nächsten Attributes, welches aber mangels Istgleichzeichen nicht als solches korrekt erkannt werden kann bzw. je nach Fehlerkorrektur des Browsers als "ohne Wert" interpretiert wird.

    Korrekterweise hättest Du (ungeachtet des schon bemängelten Stils) folgendes notieren müssen (beachte die einfachen Anführungszeichen und die korrekte Einfärbung):

    <a href="#" onclick="toggleElementDisplay('box');">Click me!</a>

    Solche Syntaxfehler finden sich am leichtesten, wenn man einen Editor mit Syntaxhighlighting benutzt. Womit arbeitest Du?

    Liebe Grüße,

    Felix Riesterer.

    --
    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
    1. Hallo Felix! Vielen Dank für dein sehr ausführliche Erklärung! Leider habe ich aber noch nicht alles so verstanden, dass ich soweit mein Problem beheben kann. Das hängt wohl damit zusammen, dass ich allgemein noch nicht richtig in den verschiedenen "Sprachen" drin stehe.

      es wäre sinnvoll, die weiteren Angaben innerhalb Deines <li>-Elements zu verpacken. Mit CSS (und völlig ohne JavaScript) kannst Du dann die :hover-Pseudoklasse nutzen, um diese Zusatzinformationen anzeigen zu lassen.

      Okay, ich sollte also alle meine Infos, hier z.B. ID und Name erstmal in das <li> packen. Soweit so gut...

      1. Allgemeine Frage:

      Es wäre auch möglich innerhalb der Schleife die Daten in ein Array zu schreiben und anschließend dieses in einer anderen Schleife zu verarbeiten. Das macht man wohl, wenn man die Datenstruktur (DB) von der Präsentation (HTML) abstrahieren will, und das Array einfach einer Template-Maschine in den Rachen wirft. Für Deinen Anwendungsfall sieht es aber tatsächlich so aus, als wäre es beim Abfragen der Datenbank am geschicktesten, das Markup gleich zu generieren.

      Leider kam ich in meiner Ausbildung und auch nun schon wieder noch nicht hinter die richtige Logik bei Arrays. Ich habe leider das Problem, dass halt denke, dass ich nur innerhalb dieser einen while schleife arbeiten kann, da ich ja sonst die komplette ausgabe meiner Daten unterbreche, was den Sinn hinter einer Datenbank ja sicherlich entgegen steht. Dann könnte ich auch alle Daten einfach in mein HTML-Dokument eintippen. "Markup" = alles was in "HTML" geschrieben ist (also kein php oder javascript), richtig oder?

      Du kannst Markup (HTML-Code) generieren, um es an den Browser zu senden. CSS und JavaScript erledigt dann der Browser. Da kann PHP sinnvollerweise nicht "mitreden".

      Wie mache ich das? Also allgemein baue ich meine Webside so auf, dass ich zu jeder HTML Datei eine CSS Datei habe, die ich halt in die HTML einbinde. Damit das schön getrennt ist (im Javascript nicht so, da ich den kopiert habe). Sonst arbeite ich auch mit "inculde" von PhP z.B. für meine Login Daten für den mySQL - Zugang. Was meinst du jetzt mit "...generieren, um es an den Browser zu senden...". Was muss ich anders machen?

      Das bedeutet, dass Dein Dokument im Mittelteil etwa so aussieht?
          <li>Name 3</li>
          <p>
              <a href="#" onclick="toggleElementDisplay("box");">Click me!</a>
              <div id="box" style="border: 1px solid #000000; display: none;">
                  ID 3
              </div>
          </p>
      </ul>[/code]

      Da stellen sich mir die Haare zu Berge! Du erzeugst ungültiges Markup!

      1.) Verstanden!
      2.) <span> Verstanden! Die anderen sind doch dazu gedacht um die Schriftart zu verändern oder?
      3.) Das mit der ID weiß ich, sonst halt class. Ich benutze in diesem Beispiel die ID doch nur zweimal wegen der Schleife (darauf habe ich nicht geachtet, danke).

      4.) Mache ich sonst auch so, jedoch habe ich diese Variante abkopiert, da ich noch viel Befehler wie z.B. onclick nicht kenne.

      Besser so:

      <ul id="boxes">

      <li>
              Name 1
              <span>ID 1</span>
          </li>
          <li>
              Name 2
              <span>ID 2</span>
          </li>
          <li>
              Name 3
              <span>ID 3</span>
          </li>
      </ul>

      
      >   
      > Dein CSS sollte dann folgendes enthalten:  
      >   
      > ~~~css
      
      #boxes li span{  
      
      >     display: none;  
      > }  
      >   
      > #boxes li:hover span {  
      >     display: block;  
      >     position: absolute;  
      > }
      
      

      Du kannst natürlich noch viel mehr an Eigenschaften definieren, aber mit diesen beiden Rulesets erhältst Du den Hover-Effekt völlig ohne JavaScript.

      Ok, das heißt ich arbeite dann mit <span> mit einer class, damit ich per CSS dieses Inline-Elemente formatieren kann. Somit formatiere ich aber nur meine Daten wie z.B. ID. Momentan ist mir leider noch nicht klar, wie ich neben meinem Namen (was ein Serientitel werden soll) einen "Button" auf dem "Anzeigen" steht erzeuge, damit wenn ich auf dem klicke darunter sich ein Fenster öffnet wo Zusatzinfos drin stehen (diese Zusatzinfos, wie z.B. ID, Episodenlänge etc.) sind einfach nur weitere Spalten. Ist meine Datenbank vielleicht flasch aufgebaut? Hover habe ich schon benutzt, das ist doch aber nur beim drüber fahren oder? Ich würder gerne per klick das akitivieren lassen, ginge das?

      5.) Das habe ich so gemacht, weil ich ja sonst wieder in mein PHP-Syntax eingegriffen hätte, das ich ja mit '' die Syntax vom Java eingeklammert habe (so hat es mir mein Editor angezeigt).

      <a href="#" onclick="toggleElementDisplay('box');">Click me!</a>

      Solche Syntaxfehler finden sich am leichtesten, wenn man einen Editor mit Syntaxhighlighting benutzt. Womit arbeitest Du?

      Werde ich gleich so nochmal probieren, wobei mir mein Editor das wieder als falsch anzeigt, wie ich bei 5. schon erläutert habe.
      Ich arbeite mit "Sublime" und habe mich regelrecht in diesen Editor verliebt (^_-).

      Vielen Dank für deine Antwort. Ehrlich gesagt hat es mir ein wenig klarheit verschafft, dennoch habe ich immernoch keine Lösung für mein Problem herauslesen können. Wie du warscheinlich gemerkt hast, bin ich noch blutiger Anfänger. Ich habe vor ca. 1 1/2 Wochen mit HTML angefange (aus Eigeninteresse). Ich bringe mir momentan alles selber bei und habe (warscheinlich deshalb) noch kein richtiges Verständnis für PHP und Allgemeinen Aufbau. Mit HTML komm ich ganz gut klar und auch in CSS fühle ich mich langsam sicherer, aber PHP und mySQL sind echt ein Brocken, den ich erstmal logisch verstehen muss. Deshalb würde ich mich für eine Antwort, bzw. einen Lösungsansatz freuen, hier nochmal kurz eine Art, wie ich es gerne aus meiner Datenbank hätte (rein zum Verständnis, falls ich dich verwirrt haben sollte):

      <h1>Serienliste</h1>
      <ul>
      <li>Serie1</li> (daneben)<span class="Button">Infos</span>
      (dadrunter öffnet sich, wenn Button geklickt eine Tabelle, die halt Attribute aus meiner Datenbank enthalten, die im jeweilien Datensatz stehen).

      So wäre es schön, sollte das zu kompliziert sein, würde mir auch ein hover erstmal reichen, nur damit ich erstmal weiter arbeiten kann. Leider stellt sich mich halt hauptsächlich die Frage, wie ich aus dieser while-schleife entkomme, denn ich möchte ja schon alle Datensätze mit einem Befehl abfragen, aber gleichzeit evtl. unterschiedliche Datensätze unterschiedlich (Designtechnisch) verändern.

      Vielen Dank aufjedenfall für deine Antwort.

      1. Okay, nach vielen Versuchen habe ich es nun doch hinbekommen... aber "nur" mit hover.
        (ich bin schon froh, dass ich es überhaupt hinbekommen habe).
        Gibt es eine Möglichkeit nun doch noch das draufklicken hinzubekommen? (Am besten auf einen Button, der daneben steht. Meine Momentaner Quelltext in der index.html:

        <ul>
        <?php
         include("login.php");
        ?>
        <?php
         $result = mysqli_query($db, "SELECT Name, ID, Episoden FROM Serien");
         while($row = mysqli_fetch_object($result))
         {
          echo
          '<li class="boxes">' ."$row->Name";
          echo
          '<span class="box">' ."$row->ID, $row->Episoden". '</span></li>';
         }
        ?>
        </ul>

        meine CSS:
        .box {
            display: none;
            }
        .boxes:hover .box{
            display: block;
            display: absolute;
            }

        1. Lieber Simon P.,

          Okay, nach vielen Versuchen habe ich es nun doch hinbekommen... aber "nur" mit hover.
          (ich bin schon froh, dass ich es überhaupt hinbekommen habe).

          prima!

          Gibt es eine Möglichkeit nun doch noch das draufklicken hinzubekommen? (Am besten auf einen Button, der daneben steht.

          Wenn Du einen Button willst, dann wird das entweder mit CSS schwierig (Nachbarselektor, benötigt CSS3-fähige Browser) oder gar nur mit JavaScript möglich.

          Meine Momentaner Quelltext in der index.html:

          <ul>
          <?php
          include("login.php");
          ?>

          Willst Du mir allen Ernstes sagen, dass Du PHP-Code in einer Datei mit der Endung ".html" stehen hast, und dass Dein Server den PHP-Code ausführt? Das sollte man besser vermeiden. Dateien mit PHP-Code sollten die Dateiendung ".php" haben. Das kann sich bis zu einem Sicherheitsrisiko hinaufschaukeln.

          meine CSS:
          .box {
              display: none;
              }
          .boxes:hover .box{
              display: block;
              display: absolute;
              }

          Du verwendest noch zuviele Klassen. Das ist nicht notwendig und bläht Dein bisschen Code nur auf. Anschließende Fehlersuche wird dadurch potenziell erschwert. Meine Beispiele in meiner anderen Antwort kommen mir einer einzigen ID aus - zugegeben mit einer dafür aufwendigeren HTML-Struktur.

          Liebe Grüße,

          Felix Riesterer.

          --
          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
          1. Lieber Felix,

            Wenn Du einen Button willst, dann wird das entweder mit CSS schwierig (Nachbarselektor, benötigt CSS3-fähige Browser) oder gar nur mit JavaScript möglich.

            Ich habe was im Internet gefunden, was evtl. das schafft was ich möchte, ich poste hier mal den Text. Leider verstehe ich den noch nicht ganz (ist ziemlich kompliziert, wie ich finde). Ich werde den mal morgen ausprobieren:
            Hier die Internetseite: http://www.php.de/wiki-php/index.php/Inhalt_ein-_und_ausblenden

            <?php

            // Dieses Array dient gleichzeitig zur Validierung gültiger Zustände
            // wie auch zum Zuordnen des Gegenzustands
            $states = array(
                           'visible' => 'hidden' ,
                           'hidden' => 'visible' ,
                           );

            $display = 'visible'; // dies ist der Initialzustand

            if (! empty ($_GET['display'])) {
              // wir nehmen nur 'visible' oder 'hidden an
              if(in_array ($_GET['display'] , $states)) {
                  $display = $_GET['display'];
              }
            }

            $link = '?display=' . $states[$display]; // Gegenteil in den Link
            ?>
            <style>
              .hidden {display:none;}
              .visible {display:block;}
            </style>
            ...
            <a href="?display=<?php echo $link; ?>">Click me!</a>
            <div class="<?php echo $display; ?>">
            Here ist some content for you!
            </div>

            Willst Du mir allen Ernstes sagen, dass Du PHP-Code in einer Datei mit der Endung ".html" stehen hast, und dass Dein Server den PHP-Code ausführt? Das sollte man besser vermeiden. Dateien mit PHP-Code sollten die Dateiendung ".php" haben. Das kann sich bis zu einem Sicherheitsrisiko hinaufschaukeln.

            Ja, irgendwas musste ich dafür ändern, ich habe momentan xampp installiert, ich weiß leider nicht mehr was, es war aufjedenfall was am server glaub ich? Naja, kann ich nun meine html Dateien einfach die Endung .php geben und alles läuft wie gehabt? inculde benutze ich leider öfters, daher wüsste ich nicht, wie ich das html technisch lösen müsste. (include benutze ich z.B. für eine Neuigkeiten-Spalte am rechten rand, die in allen meinen HTML Dateien ist, damit ich nicht in 20 HTML Seiten meine Neuigkeit einfügen muss)

            Du verwendest noch zuviele Klassen. Das ist nicht notwendig und bläht Dein bisschen Code nur auf. Anschließende Fehlersuche wird dadurch potenziell erschwert. Meine Beispiele in meiner anderen Antwort kommen mir einer einzigen ID aus - zugegeben mit einer dafür aufwendigeren HTML-Struktur.

            ja, ich denke, ich könnte meinen CSS-Code geringer halten, aber ich denke, dass würde die Übersichtlichkeit hemmen. Somit muss ich ja immer ersteinmal nachvollziehen, wo was ist, bzw. die Struktur nachvollziehen . Aber sobald meine CSS-Dateien wachsen, werde ich umsteigen. Bei diesem Projekt ist das erstmal nicht notwendig glaube ich. (8kb größte CSS)

            Vielen Dank nochmal für die nette Unterstützung!

            1. Lieber Simon P.,

              Du versteigst Dich da in PHP-Konstrukte, anstatt Dein eigentliches Problem, das Markup, zu verstehen und zu verbessern.

              Ich habe was im Internet gefunden, was evtl. das schafft was ich möchte, ich poste hier mal den Text. Leider verstehe ich den noch nicht ganz (ist ziemlich kompliziert, wie ich finde).

              Mir scheint, hier wird PHP-seitig "nachgeholfen", damit der Browser Dinge so darstellt, wie Du das möchtest. Das kann der aber auch ohne PHP ganz gut, wenn Du die clientseitigen Technologien (HTML&CSS) vernünftig(!!) einsetzt - ohne PHP. Meine Fiddles dazu hast Du schon gesehen?

              Naja, kann ich nun meine html Dateien einfach die Endung .php geben und alles läuft wie gehabt?

              Mach es so: Eine HTML-Datei enthält keinen PHP-Code und endet auf ".html". Eine Datei, die PHP-Code enthält, hat die Endung ".php".

              inculde benutze ich leider öfters, daher wüsste ich nicht, wie ich das html technisch lösen müsste. (include benutze ich z.B. für eine Neuigkeiten-Spalte am rechten rand, die in allen meinen HTML Dateien ist, damit ich nicht in 20 HTML Seiten meine Neuigkeit einfügen muss)

              Dazu ist PHP ja gedacht!

              ja, ich denke, ich könnte meinen CSS-Code geringer halten, aber ich denke, dass würde die Übersichtlichkeit hemmen.

              Übersichtlichkeit "hemmen"? Nein. Je weniger Klassen Du benutzt, desto klarer wird das Ganze. Man sieht im Code dann sofort, welche Zusammenhänge welche Klassen oder IDs haben, da man die Selektoren passend im Code gruppieren kann. Vergleiche einmal:

              .box { border: 1px solid black; }  
              #boxes .box { display: none; }  
              .box .current { display: block; }
              

              Im obigen Beispiel werden zwei Klassen und eine ID verwendet. Wie diese jeweils zusammenhängen wird nicht klar. Jetzt das Gegenbeispiel:

              #box li dl { border: 1px solid black; display: none; }  
              #box li:hover dl { display: block; }
              

              Meiner Ansicht nach ist klar, dass hier alles an einem Element mit der ID "box" hängt. Seine Nachfahren-Elemente <li> und <dl> werden nach einer ":hover"-Eigenschaft entsprechend gesteuert.

              Somit muss ich ja immer ersteinmal nachvollziehen, wo was ist, bzw. die Struktur nachvollziehen .

              Eben! Genau darum geht es doch!

              Aber sobald meine CSS-Dateien wachsen, werde ich umsteigen. Bei diesem Projekt ist das erstmal nicht notwendig glaube ich. (8kb größte CSS)

              Warum zuerst ungünstig und unpraktisch, wenn man einen Hinweis bekommt, wie man das vermeiden kann?

              Übrigens habe ich nun auch wieder etwas dazugelernt und kann Dir nun (noch immer ohne JavaScript-Einsatz!) eine Version mit Buttons bieten.

              Liebe Grüße,

              Felix Riesterer.

              --
              "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
              1. Lieber Simon P.,

                Du versteigst Dich da in PHP-Konstrukte, anstatt Dein eigentliches Problem, das Markup, zu verstehen und zu verbessern.

                Ja, da hast du recht, teils auch aus Verzweifelung.

                Ich habe was im Internet gefunden, was evtl. das schafft was ich möchte, ich poste hier mal den Text. Leider verstehe ich den noch nicht ganz (ist ziemlich kompliziert, wie ich finde).

                Mir scheint, hier wird PHP-seitig "nachgeholfen", damit der Browser Dinge so darstellt, wie Du das möchtest. Das kann der aber auch ohne PHP ganz gut, wenn Du die clientseitigen Technologien (HTML&CSS) vernünftig(!!) einsetzt - ohne PHP. Meine Fiddles dazu hast Du schon gesehen?

                Habe ich jetzt gesehen, SUPER! Ich werds gleich ausprobieren, ob ich das hinkriege so wie es dort ist, dass wäre ein sehr gute Lösung! Nebenbei die Frage, was sind Fiddles?

                Mach es so: Eine HTML-Datei enthält keinen PHP-Code und endet auf ".html". Eine Datei, die PHP-Code enthält, hat die Endung ".php".

                Nunja, da ich ja auf jeder Seite, diese Spalte "Neuigkeiten" habe und die ja durch php eingefügt wird, müsste ich ja nun die Seiten alle auf .php ändern, geht das so einfach?

                (include benutze ich z.B. für eine Neuigkeiten-Spalte am rechten rand, die in allen meinen HTML Dateien ist, damit ich nicht in 20 HTML Seiten meine Neuigkeit einfügen muss)

                Dazu ist PHP ja gedacht!

                OK

                .box { border: 1px solid black; }

                #boxes .box { display: none; }
                .box .current { display: block; }

                
                >   
                > Im obigen Beispiel werden zwei Klassen und eine ID verwendet. Wie diese jeweils zusammenhängen wird nicht klar. Jetzt das Gegenbeispiel:  
                >   
                > ~~~css
                
                #box li dl { border: 1px solid black; display: none; }  
                
                > #box li:hover dl { display: block; }
                
                

                Meiner Ansicht nach ist klar, dass hier alles an einem Element mit der ID "box" hängt. Seine Nachfahren-Elemente <li> und <dl> werden nach einer ":hover"-Eigenschaft entsprechend gesteuert.

                Okay, nun verstehe ich was du meinst.

                Warum zuerst ungünstig und unpraktisch, wenn man einen Hinweis bekommt, wie man das vermeiden kann?

                Werde ich mich mal demnächst an die Arbeit machen um meine CSS-Dateien zu verändern.

                Übrigens habe ich nun auch wieder etwas dazugelernt und kann Dir nun (noch immer ohne JavaScript-Einsatz!) eine Version mit Buttons bieten.

                Das freut mich! Ich werde mir das nochmal alles gut durchlesen. Sollte das klappen, werde ich hier nochmal reinposten, dass es funktioniert hat. Die letzte Frage die ich habe ist nur noch die Trennung zwischen PHP und HTML, die ich oben beschrieben habe (mit der Include Funktion).
                Vielen Dank nochmal! Ich hoffe ich habe nicht zu viel deiner Zeit geraubt.

                1. Lieber Simon P.,

                  was sind Fiddles?

                  Das Wort kommt aus dem Englischen (to fiddle with sth). JSFiddle.net bietet ein Werkzeug an, in dem man Code und seine Funktionalität testen kann - sehr nützlich, wenn man zu mehreren an etwas arbeitet/diskutiert/testet.

                  Nunja, da ich ja auf jeder Seite, diese Spalte "Neuigkeiten" habe und die ja durch php eingefügt wird, müsste ich ja nun die Seiten alle auf .php ändern, geht das so einfach?

                  Ja. In PHP kannst Du PHP-Code includieren, genauso wie HTML-Code. In Zukunft wird es für Dich aber besser sein, wenn Du HTML-Code aus Deinen PHP-Scripten heraus lässt. Stattdessen könntest Du so vorgehen:

                  Datei "pages/template.html":

                  <!DOCTYPE html>  
                  <html><head><title>Test</title></head><body>  
                  <main>  
                      <article>  
                  {$contents}  
                      </article>  
                      <section>  
                  {$news}  
                      </section>  
                  </main>  
                  <nav>  
                      <h1>Navigation</h1>  
                      <ul>  
                          <li><a href="/">Home</a></li>  
                          <li><a href="/contact">Kontakt/Impressum</a></li>  
                      </ul>  
                  </nav>  
                  </body></html>
                  

                  Datei "pages/home.html":

                    
                          <h1>Meine Seite</h1>  
                          <p>Willkommen auf meiner Website! Schauen Sie sich doch einmal um und bleiben Sie ein Weilchen.</p>
                  

                  Datei "pages/contact.html":

                    
                          <h1>Kontakt / Impressum</h1>  
                          <p>Wenn auf meiner Seite Mist steht, dann bin ich schuld. Mich erreicht man hier:</p>
                  

                  Datei "pages/news.html":

                    
                          <h1>News</h1>  
                          <dl>  
                              <dt>20.07.2014</dt><dd>Arbeiten an der Seite gehen weiter...</dd>  
                              <dt>13.07.2014</dt><dd>Wir sind wieder Weltmeister!</dd>  
                          </dl>
                  

                  Datei "index.php":

                  <?php  
                    
                  // list of pages  
                  $pages = array(  
                      'contact' => 'contact.html',  
                      'home'    => 'home.html'  
                  );  
                    
                  // load contents  
                  $contents = file_get_contents('./pages/home.html'); // default  
                    
                  // other than HOME page requested?  
                  if (array_key_exists('p', $_GET)  
                      // do we have such a page?  
                      && array_key_exists($_GET['p'], $pages)  
                  ) {  
                      $contents = file_get_contents('./pages/'.$_GET['p']);  
                  }  
                    
                  // get template  
                  $tmp = file_get_contents('./pages/template.html');  
                    
                  // get news  
                  $news = file_get_contents('./pages/news.html');  
                    
                  // put it all together  
                  $tmp = str_replace(  
                      array('{$contents}', '{$news}'),  
                      array(  $contents,     $news  ),  
                      $tmp  
                  );  
                    
                  // send everything to the browser  
                  echo $tmp;  
                    
                  ?>
                  

                  Eine Seite, die den obigen Code verwendet, ruft man so auf:
                  http://example.org/index.php?p=contact
                  oder so:
                  http://example.org/?p=contact

                  Die letzte Frage die ich habe ist nur noch die Trennung zwischen PHP und HTML, die ich oben beschrieben habe (mit der Include Funktion).

                  Hoffentlich konnte ich Dir da einen Impuls geben, der Dir weiterhilft.

                  Liebe Grüße,

                  Felix Riesterer.

                  --
                  "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                  1. Lieber Felix,

                    ich habe das oben gepostet mal ausprobieren, also index.php und daneben ein Ordner "pages" wo die anderen Dateien liegen. Habe alles so abkopiert und eingefügt. Leider funktioniert die Navigation nicht. Ich werde es mir nachdem ich mein Datenbankproblem gelöst habe mal anschauen, wie ich nun meine Webside umstrukturiere. Momentan verstehe ich den Syntax von der index.php nicht.
                    Ist es denn so schlimm, wenn ich in einer HTML nur die PHP include Funktion benutze und der Rest sonst nur HTML ist?

                    Grüße, Simon

                    1. Lieber Simon P.,

                      Leider funktioniert die Navigation nicht.

                      OH! Ja, da sollte im href-Attribut der Wert "?p=contact" oder so ähnlich stehen. Das, was mach dem Istgleichzeichen steht, entspricht ja einem Schlüssel aus dem Array $pages! Wenn der nicht gefunden wird, wird die HOME-Seite ausgegeben (default).

                      Momentan verstehe ich den Syntax von der index.php nicht.

                      Was genau verstehst Du nicht?

                      Ist es denn so schlimm, wenn ich in einer HTML nur die PHP include Funktion benutze und der Rest sonst nur HTML ist?

                      Später schon.

                      Liebe Grüße,

                      Felix Riesterer.

                      --
                      "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                      1. Lieber Felix,

                        Leider funktioniert die Navigation nicht.

                        OH! Ja, da sollte im href-Attribut der Wert "?p=contact" oder so ähnlich stehen. Das, was mach dem Istgleichzeichen steht, entspricht ja einem Schlüssel aus dem Array $pages! Wenn der nicht gefunden wird, wird die HOME-Seite ausgegeben (default).

                        Hat leider aus irgendeinem Grund nicht funktioniert. Leider kann ich den Grund nicht bennen, weil ich den Aufbau deines Vorschlages nicht verstehe.

                        Momentan verstehe ich den Syntax von der index.php nicht.

                        Was genau verstehst Du nicht?

                        Ehrlich gesagt verstehe ich den gesamten Aufbau des PHP Systems im Zusammenhang mit deinem Vorschlag nicht.
                        So, wie ich es bisher verstanden habe:
                        Die Template.html ist meine frühere index.html, die sozusagen nur das Grundgerüst beinhaltet und die CSS greift auf diese template.html zu. Die anderen HTML Dateien wie z.B. "news" enthalten nur den Text der dann an der richtigen Stelle in die Template.html eingefügt wird, was dann eine andere Seite im Internet ergibt. Inhalte, die auf jeder Seite vorhanden sind, werden in die Template gepackt. Wie z.B. eine Neuigkeiten Spalte, deren Inhalt ich ja dann nur noch in der Template.html benötige und deshalb auch nur einmal ändern muss und keine Include-Funktion mehr benötige. Die PHP index verwaltet das ganze System.
                        Leider habe ich jetzt dazu noch Fragen.
                        1. Gibt es für dieses System ein gutes Tutorial, wo man die genauen Schritte nachvollziehen kann?
                        2. Ich stelle mir es ziemlich kompliziert vor, mit diesem System sein gewünschtes Design zu bekommen. Ich muss ja meine .html Dateien immer an die Template irgendwie anpassen. Wenn ich jetzt nicht nur was innerhalb des <section> Teils ändern will, sondern vielleicht auch was an der <Nav> (weil ich ja von innerhalb eines Themas, immer noch anderen Themen habe), wie mache ich das dann.
                        3. Wie du schon merkst, verstehe ich noch nicht ganz, wie die einzelnen Schritte ineinander greifen. Vielleicht könntest du mir einen Link zu einem guten Tutorial schicken (vielleicht, wo du das System kennen gelernt hast oder selbst erlernt hast).

                        Vielen Dank nochmal für deine Hilfe, jetzt habe ich aufjedenfall schon dazugelernt, wie man mit PHP seine Daten aus mySQL bekommt. Damit habe ich schon einen Anfang.
                        Liebe Grüße
                        Simon P.

                        1. Lieber Simon P.,

                          OH! Ja, da sollte im href-Attribut der Wert "?p=contact" oder so ähnlich stehen. Das, was mach dem Istgleichzeichen steht, entspricht ja einem Schlüssel aus dem Array $pages! Wenn der nicht gefunden wird, wird die HOME-Seite ausgegeben (default).

                          Hat leider aus irgendeinem Grund nicht funktioniert. Leider kann ich den Grund nicht bennen, weil ich den Aufbau deines Vorschlages nicht verstehe.

                          dann nimm Dir mehr Zeit und studiere insbesondere die Fehlermeldungen in Deinem Server-Log! Ohne diese kannst Du Fehler kaum finden.

                          Ehrlich gesagt verstehe ich den gesamten Aufbau des PHP Systems im Zusammenhang mit deinem Vorschlag nicht.

                          Sehr schade, denn dann hast Du die Trennung zwischen PHP-Logik und HTML-Struktur noch nicht verinnerlicht und wirfst in Gedanken noch immer die Dinge zusammen, die nicht zusammen gehören.

                          So, wie ich es bisher verstanden habe:
                          Die Template.html ist meine frühere index.html, die sozusagen nur das Grundgerüst beinhaltet und die CSS greift auf diese template.html zu.

                          Ja, ja und nein. CSS greif auf überhaupt nichts zu. Ja, in template.html steht das HTML-Grundgerüst, welches mit CSS ausgestaltet wird, weil die auszugestaltenden Elemente (mitsamt ihren id- und class-Attributwerten) dort berücksichtigt werden.

                          Aber:

                          Sowohl die News, als auch redaktionelle Inhalte stehen in eigenen HTML-Dateien, die bei Bedarf (abhängig vom p-Parameter in der URL) in das Grundgerüst (template.html) eingefügt werden. Die News werden immer gleich an der immer gleichen Stelle eingefügt, die redaktionellen Inhalte eben nicht, sondern in Abhängigkeit von dem, was nach "p=" in der Adresse (URL) steht.

                          Die anderen HTML Dateien wie z.B. "news" enthalten nur den Text der dann an der richtigen Stelle in die Template.html eingefügt wird, was dann eine andere Seite im Internet ergibt.

                          Ja und nein. Ja, die Dateien enthalten Inhalte, die im Template an der richtigen Stelle eingefügt werden. Aber das ergibt noch nicht unbedingt eine andere Seite im Internet. Der "news"-Teil soll doch auf jeder Seite identisch eingebunden werden, oder nicht? Änderst Du diesen Teil (also den Inhalt der news.html), dann änderst Du die "Seitenleiste" aller Webseiten Deiner Website.

                          Im Moment sind nur die Dateien home.html, contact.html und serien.html für "verschiedene Seiten". Die beiden anderen (template.html und news.html) sind für "stehende" immergleiche Seitenbestandteile.

                          Inhalte, die auf jeder Seite vorhanden sind, werden in die Template gepackt. Wie z.B. eine Neuigkeiten Spalte, deren Inhalt ich ja dann nur noch in der Template.html benötige und deshalb auch nur einmal ändern muss und keine Include-Funktion mehr benötige. Die PHP index verwaltet das ganze System.

                          Jein. Ist es wirklich sinnvoll, sowohl die Navigation als auch die News im Template vorzuhalten? Wenn Du wissen willst, von wann die News sind, wäre ein Datum der letzten Änderung der Datei "news.html" sinnvoll. Das Template darf ruhig seitdem verändert worden sein (ebenso die Navigation darin). Für das Datum der News wäre es allerings fatal, wenn es an der letzten Änderung des Templates selbst hinge...

                          Die Scriptdatei index.php regelt dann an sich den Rest, das ist richtig.

                          Leider habe ich jetzt dazu noch Fragen.

                          1. Gibt es für dieses System ein gutes Tutorial, wo man die genauen Schritte nachvollziehen kann?

                          Meine Postings sollten Dir Denkanstöße geben. Sie sind mit ungetestem Code versehen, denn zum Testen bräuchte ich mehr Zeit und Du würdest bei der Umsetzung weniger lernen. Daher schlage ich vor, dass Du das Handling der index.php als höchste Priorität betrachtest, denn diese ist die zentrale Schaltstelle.

                          1. Ich stelle mir es ziemlich kompliziert vor, mit diesem System sein gewünschtes Design zu bekommen.

                          Hörst Du jetzt bitte endlich mit dem Design-Quatsch auf!? Bei PHP geht es nicht um Design, sondern um die Logik eines Ablaufs (Programm)! Bei HTML geht es um eine Dokument-Struktur. Wo willst Du da etwas von Design? Von Programm-Design? Von Sprachdesign?

                          Lerne die Grundlagen, bevor Du an künstlerische Ausgestaltungen von visuellen (Print-?)Vorstellungen gehst. Das ist eine der schwersten Lektionen für Anfänger im Webseitenerstellen. Vergiss, wie es am Ende aussehen soll für eine Weile. Du kriegst sonst nichts gebacken, weil Du ansonsten wieder so einen Unsinn wie <h1><b>...</b></h1> schraubst, der einfach nur Müll ist - aber vielleicht vordergründig und vorübergehend Deinen visuellen Vorstellungen näher kommt.

                          Ich muss ja meine .html Dateien immer an die Template irgendwie anpassen.

                          Bitte was? Sie müssen so geschrieben sein, dass sie ein Element korrekt befüllen können. Sie enthalten Inhalt! Ohne Inhalt keine Seite! Fang doch bitte an, an Deinem Verständnis für Strukturen zu arbeiten! Vergiss das Aussehen! Das kommt noch, aber nicht jetzt!

                          Wenn ich jetzt nicht nur was innerhalb des <section> Teils ändern will, sondern vielleicht auch was an der <Nav> (weil ich ja von innerhalb eines Themas, immer noch anderen Themen habe), wie mache ich das dann.

                          Du kannst doch in Deinem <article>-Element diverse <section>-Elemente unterbringen, oder etwa nicht? Und was hält Dich davon ab, weitere Elemente in Deinen News zu nutzen?

                          In meinen Fiddles kannst Du sehen, dass es eine ganze Menge verschiedener Elemente zur Textstrukturierung gibt, die Dir zur Verfügung stehen. Beachte für den Moment nur nicht, wie die dann "aussehen".

                          1. Wie du schon merkst, verstehe ich noch nicht ganz, wie die einzelnen Schritte ineinander greifen. Vielleicht könntest du mir einen Link zu einem guten Tutorial schicken (vielleicht, wo du das System kennen gelernt hast oder selbst erlernt hast).

                          Du kannst doch meine Code-Beispiele genauer studieren und die verwendeten Teile in den entsprechenden Quellen nachlesen. Links zu verwendeten PHP-Funktionen habe ich bereits gepostet. Das, was Du daran zuerst nicht verstanden hast, hast Du nachgefragt und erklärt bekommen. Manchmal ist es auch sinnvoll, einfach davon auszugehen, dass "es tut" - wenn keine Fehlermeldungen im Server-Log landen. Das Verständnis kommt dann später, wenn man an anderer Stelle wieder etwas verstanden hat, wie von selbst.

                          Das "System" ist übrigens ein kleines winziges PHP-Script, das rudimentäre Elemente der Programmiersprache PHP nutzt und dabei recht einfachen HTML-Code verarbeitet.

                          Vielen Dank nochmal für deine Hilfe, jetzt habe ich aufjedenfall schon dazugelernt, wie man mit PHP seine Daten aus mySQL bekommt. Damit habe ich schon einen Anfang.

                          Das war nur der Aufhänger, um sinnvoll anzufangen. Inzwischen ist die MySQL-Anbindung nur eine Nebenbaustelle. Der Hauptteil Deiner Arbeit sollte das Trennen von serverseitiger und clientseitiger Technik sein, das Aufteilen Deiner Dokumentstruktur in modulare Teile (Template, News, Navi und Inhalt) und das Zusammenfügen in Abhängigkeit eines Search-Parameters.

                          Nicht aufgeben! Wenn Dir der Kopf raucht, einfach Pause machen, setzen lassen und an einem anderen Tag mit frischeren Hirnzellen weitermachen. :-) Manches an Komplexität ist nunmal nicht so leicht verdaulich...

                          Liebe Grüße,

                          Felix Riesterer.

                          --
                          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                          1. Lieber Felix,

                            Vielen Dank für deine Motivation. Ich werde nochmal von vorne mit PHP anfangen um meine Verständnisslücken zu stopfen.

                            Grüße
                            Simon P.

                            1. Hallo Felix,

                              ich bin heute nochmal die index.php durchgegangen und habe jeden Befehl im Manual nachgelesen und wie ich denke verstanden. Im Zusammenhang damit habe ich nun auch endlich das System verstanden denke ich. Ich werde jetzt auch besser darauf achten, wie ich mich ausdrücke, damit du meinen Standpunkt besser verstehen kannst.

                              Also, So denke ich funktioniert es:
                              <?php

                              // list of pages
                              $pages = array(
                                  'contact' => 'contact.html',
                                  'home'    => 'home.html'
                              );

                              Zuerst werden den HTML Dateien die jeweiligen Schlüssel zugewiesen.

                              $contents = file_get_contents('./pages/home.html');

                              danach wird alles was in der home.html steht als string in die Variable $contents "geschrieben" (sagt man das so?).

                              Nun der, wie ich finde, schwierigste Teil.

                              if (array_key_exists("p", $_GET)

                              && array_key_exists($_GET["p"], $pages)
                              ) {
                                  $contents = file_get_contents('/pages/'.$_GET["p"]);
                              }

                              die if-Anweisung prüft als erstes ob in der Variable $_GET, der Wert 'p' vorhanden ist. Und die Anweisung prüft ob eine Variable, die sich im Array $_GET befindet, ein Wert aus der Variable $pages ist. Sollte beides übereinstimmen, dann wird in die Variable $contents das eingefügt, was in der Datei, die den jeweiligen Variablenwert von $pages hat, steht. Zum Beispiel, die contact.html.

                              $tmp = file_get_contents('./pages/template.html');

                              // get news
                              $news = file_get_contents('./pages/news.html');

                              $serien = file_get_contents('./pages/serien.html');

                              $contact = file_get_contents('./pages/contact.html');

                              Hiermit werden einfach die Inhalte der HTML Dateien in die Variablen eingefügt.

                              $tmp = str_replace(
                                  array('{$contents}', '{$news}'),
                                  array(  $contents,     $news),
                                  $tmp
                              );

                              Hiermit wird gesagt, dass nun das erste array mit dem Werten aus dem zweiten Array ersetzt wird und in $tmp geschrieben wird.

                              echo $tmp;
                              ?>
                              Einfache Ausgabe von allem.

                              So, in der template sind die links so:

                              <li><a href="/">Home</a></li>
                              <li><a href="?p=contact">Kontakt/Impressum</a></li>

                              Wenn ich nun in der Navigation auf "Kontakt" klicke, wird der Wert der Variable $_GET zu p=contact was dann in der if-Anweisung dazu führen sollte, dass nun die contact.html in die Variable $contents geschrieben wird und diese sollte dann ausgegebn werden. Das funktioniert soweit auch (addresszeile hat den richtigen pfad). Leider kommt dann diese Fehlermeldung, da wo der Text dann eigentlich stehen sollte:

                              Warning: file_get_contents(/pages/contact): failed to open stream: No such file or directory in D:\HTML__\Xampp\htdocs\phptest\index.php on line 17

                              Natürlich habe ich nun schon mehrfach den Pfad geändert usw. aber es ändert sich nicht. Meine index.php liegt in einem Ordner. Und in diesem Ordner ist ein weiterer Ordner "pages" der die HTML Dateien beeinhaltet. Also sollte alles stimmen.

                              Wo habe ich den Fehler nun übersehen? Wie arbeitet php an dieser Stelle? Ich öffne die index.php und der Quelltext wird dann einmal eingelesen. Somit wird alles ausgegeben, wie es sein sollte (news.html, home.html, template.html). Wenn ich nun aber in der Navi auf einen link klicke, ändert sich ja die URL und die index.php wird nicht noch einmal ausgeführt, sprich der Quelltext wird nicht noch einmal eingelesen oder?

                              Was übersehe ich da oder habe ich immernoch einen Denkfehler?

                              Liebe Grüße
                              Simon P.

                              1. Lieber Simon P.,

                                Im Zusammenhang damit habe ich nun auch endlich das System verstanden denke ich.

                                das klingt alles sehr fleißig und vielversprechend!

                                Ich werde jetzt auch besser darauf achten, wie ich mich ausdrücke, damit du meinen Standpunkt besser verstehen kannst.

                                Ja, vielleicht haben wir ein kleines Kommunikationsproblem nebenbei gehabt. Aber daran kann man wachsen.

                                if (array_key_exists("p", $_GET)

                                && array_key_exists($_GET["p"], $pages)
                                ) {
                                    $contents = file_get_contents('/pages/'.$_GET["p"]);
                                }

                                die if-Anweisung prüft als erstes ob in der Variable $_GET, der Wert 'p' vorhanden ist.

                                Prinzipiell hast Du schon Recht, genauer wird geprüft, ob im Array $_GET ein Schlüssel "p" angelegt ist, nicht ob der Wert "p" vorhanden ist. Für Deine Zwecke benötigst Du im Moment nur die drei Prüfungen:

                                1.) gibt es einen Schlüssel "p" in meinem Array?
                                2.) gibt es einen Wert "p" in meinem Array?
                                3.) wieviele Schlüssel-Wert-Paare enthält mein Array?

                                Und die Anweisung prüft ob eine Variable, die sich im Array $_GET befindet, ein Wert aus der Variable $pages ist.

                                Im Grunde hast Du schon Recht, genauer wird überprüft, ob der dem Schlüssel "p" zugewiesene Wert (Arrays enthalten Schlüssel-Wert-Paare) einem in $pages vorhandenen Schlüssel entspricht (damit später dann dessen Wert als Dateinamen benutzt werden kann).

                                Diese anscheinend umständliche Prüfung ist wichtig, damit hier keine Attacken über manipulierte Werte gestartet werden können, um Schadcode auf Deinen Server zu spielen, oder sensible Daten auszulesen (wie z.B. Dein DB-Passwort).

                                Sollte beides übereinstimmen, dann wird in die Variable $contents das eingefügt, was in der Datei, die den jeweiligen Variablenwert von $pages hat, steht. Zum Beispiel, die contact.html.

                                Exakt. Du hast alles verstanden.

                                So, in der template sind die links so:

                                <li><a href="/">Home</a></li>
                                <li><a href="?p=contact">Kontakt/Impressum</a></li>

                                Wenn ich nun in der Navigation auf "Kontakt" klicke, wird der Wert der Variable $_GET zu p=contact was dann in der if-Anweisung dazu führen sollte, dass nun die contact.html in die Variable $contents geschrieben wird und diese sollte dann ausgegebn werden.

                                Ja, im Grunde richtig. Wenn Du auf den Link klickst, dann fordert der Browser eine Ressource nach dem folgenden Schema an:

                                http://example.org/?p=contact
                                http://localhost/?p=contact

                                Das bedeutet aus Sicht von PHP, dass die Variablen $_GET (ein superglobales Array) einen Schlüssel "p" mit dem zugeordneten Wert "contact" enthält. Das könnte für diesen Query-String ("?p=contact&foo=bar&blah=blubb") so aussehen:

                                $_GET = array(  
                                    'p' => 'contact',  
                                    'foo' => 'bar',  
                                    'blah' => 'blubb'  
                                );
                                

                                Leider kommt dann diese Fehlermeldung, da wo der Text dann eigentlich stehen sollte:

                                Warning: file_get_contents(/pages/contact): failed to open stream: No such file or directory in D:\HTML__\Xampp\htdocs\phptest\index.php on line 17

                                In anderen Worten: Der Pfad "D:\HTML__\Xampp\htdocs\phptest/pages/contact" führt im Dateisystem zu keiner Ressource. Wir wollen noch ein ".html" am Ende stehen haben. Dann klappt's auch mit der HTML-Datei. Warum da jetzt aber kein ".html" am Ende steht, muss im PHP-Code zu finden sein. Offensichtlich wird der Schlüssel von $pages (also $_GET['p']) benutzt, anstatt der ihm zugewiesene Wert ($pages[$_GET['p']]) - mein Fehler, da ich Dir ungetesten Code gegeben habe. Ändere folgende Zeile entsprechend:

                                  
                                    // $contents = file_get_contents('./pages/'.$_GET['p']);  
                                    $contents = file_get_contents('./pages/'.$pages[$_GET['p']]);  
                                
                                

                                Wie arbeitet php an dieser Stelle? Ich öffne die index.php und der Quelltext wird dann einmal eingelesen. Somit wird alles ausgegeben, wie es sein sollte (news.html, home.html, template.html). Wenn ich nun aber in der Navi auf einen link klicke, ändert sich ja die URL und die index.php wird nicht noch einmal ausgeführt, sprich der Quelltext wird nicht noch einmal eingelesen oder?

                                Wenn der Browser eine Ressource vom Server anfordert, muss der die Anfrage beantworten. Dazu benutzt er hier ein PHP-Script, da die Anfrage immer auf /index.php zeigt. Neue Seite bedeutet eine neue Anfrage des Browsers an den Server, also ein erneutes Aufrufen des PHP-Scripts.

                                Liebe Grüße,

                                Felix Riesterer.

                                --
                                "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                1. Hallo Felix,

                                  ich hatte einen ähnlichen gedanken wie du. Ich habe in der Navigation in href einfach ein .html, also so:

                                  <li><a href="?p=contact.html">Kontakt/Impressum</a></li>

                                  rangehangen. Auf deine Lösung bin ich zu dem Zeitpunkt noch nicht gekommen. Leider bringt mich deine Lösung auch nicht weiter, so wie es scheint. Hier die neue Fehlermeldung:

                                  Warning: file_get_contents(/pages/contact.html): failed to open stream: No such file or directory in D:\HTML__\Xampp\htdocs\phptest\index.php on line 17

                                  Ich habe vorsichtshalber auch noch die HTML zu meiner index.php in den Ordner gelegt. Aber es hat nichts genutzt. Ich hatte es schon beschrieben, aber hier nochmal, damit du nicht nach meiner Antwort suchen musst (falls es daran liegt):

                                  index.php liegt in dem Ordner "phptest"

                                  in dem Ordner "phptest" ist ein weiterer Ordner mit "pages"

                                  in "pages" liegt die contact html und weitere, auf die er ja schon zugreift. Komisch das er auf die contact.html nicht zugreifen kann. Außerdem habe ich noch einmal alle Namen (in der template, in der index, und den Dateinamen selbst) auf Gleichheit überprüft. Alles richtig.
                                  Was läuft da schief? Fehlt ne config auf meinem Server?

                                  Grüße
                                  Simon P.

                                  1. Lieber Simon P.,

                                    <li><a href="?p=contact.html">Kontakt/Impressum</a></li>
                                    [...]
                                    Warning: file_get_contents(/pages/contact.html): failed to open stream: No such file or directory in D:\HTML__\Xampp\htdocs\phptest\index.php on line 17

                                    das bedeutet, dass er unter dem angegebenen Pfad keine passende Ressource findet.

                                    index.php liegt in dem Ordner "phptest"

                                    in dem Ordner "phptest" ist ein weiterer Ordner mit "pages"

                                    in "pages" liegt die contact html und weitere, auf die er ja schon zugreift. Komisch das er auf die contact.html nicht zugreifen kann. Außerdem habe ich noch einmal alle Namen (in der template, in der index, und den Dateinamen selbst) auf Gleichheit überprüft. Alles richtig.
                                    Was läuft da schief? Fehlt ne config auf meinem Server?

                                    Keine Ahnung. Bei mir klappt es, wenn ich diesen ZIP-Inhalt in ein beliebiges Verzeichnis auf meinem lokalen Testserver entpacke und dort (z.B. http://localhost/phptest/) aufrufe.

                                    Liebe Grüße,

                                    Felix Riesterer.

                                    --
                                    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                    1. Lieber Felix,

                                      ich habe meinen Fehler entdeckt, als ich mein Script mit deinem verglichen habe. Ich werde jetzt mal versuchen, meine Website, die ich bisher flasch angefertigt habe, serverseitig anzufertigen.

                                      Ich bedanke mich nochmal vielmals für deine ausführlichen Antworten, deine Hilfestellungen, deine Erklärungen und vorallem deine investierte Zeit.

                                      Liebe Grüße
                                      Simon P.

                                      1. Hallo Felix,

                                        nach zweitägigem Probieren meine bisher erstellte Website Serverseitig aufzubauen bin ich schon wieder an einer Stelle, an der ich nicht weiterkomme. Das liegt warscheinlich daran, dass ich mich mit php noch weniger auskenne als mit html. Somit komm ich warscheinlich einfach nicht auf die Möglichkeiten, die man mit PHP hat.

                                        Ich habe dir hier mal meine index. und alles weitere hochgeladen, damit du eine ungefähre Vorstellung von meiner bisherigen Website hast. Eventell wird php nicht in der html bei dir funktionieren, weil ich in der config meines Servers ändern musste, dass auch php in html code interpretiert wird.

                                        Meine Index

                                        Ich habe das System des Serverseitigen Aufbaus verstanden, und denke, dass es mit dem System (soweit mein Wissen reicht) nicht funktioniert, mehrere dynamische Inhalte einer html in dem System unterzubringen. Wie auch auf der Index gibt es oben eine Steuerung, die auf allen Seiten gleich ist. Links gibt es allerdings eine Steuerung die sich von Seite zu Seite ändert. Wie kann ich das also in mein template ändern, dass ich je nach Seite auch die navi ändert.
                                        Das zweite was ich nicht verstehe ist, wie ich php-Funktionen (wie in include), die in einer html eingebunden sein sollen, so einfüge, dass sie eben nicht in dem html markup sind, aber dennoch irgendwie zu dieser gehören. Wie stelle ich eine "Beziehung" zu den Inhalten her?

                                        Meine Site habe ich dir einfach zum downloaden bereit gestellt, damit du siehst, wie es bei mir momentan aufgebaut ist.

                                        Liebe Grüße,
                                        Simon p.

                                        1. Hallo

                                          Ich habe das System des Serverseitigen Aufbaus verstanden, und denke, dass es mit dem System (soweit mein Wissen reicht) nicht funktioniert, mehrere dynamische Inhalte einer html in dem System unterzubringen. Wie auch auf der Index gibt es oben eine Steuerung, die auf allen Seiten gleich ist. Links gibt es allerdings eine Steuerung die sich von Seite zu Seite ändert. Wie kann ich das also in mein template ändern, dass ich je nach Seite auch die navi ändert.

                                          Du änderst nicht das Template an sich, sondern die Ablaufsteuerung durch PHP. Du musst es ermöglichen, dass mit PHP die aktuelle Seite identifiziert werden kann. Kannst du die Seite identifizieren, kannst du auch entscheiden, welches Untermenü (ich vermute, dass es das ist, was du mit „Steuerung“ meinst) und welche sonstigen Inhalte einzufügen sind.

                                          Das zweite was ich nicht verstehe ist, wie ich php-Funktionen (wie in include), die in einer html eingebunden sein sollen, so einfüge, dass sie eben nicht in dem html markup sind, aber dennoch irgendwie zu dieser gehören. Wie stelle ich eine "Beziehung" zu den Inhalten her?

                                          Ähhh, wasss?

                                          Tschö, Auge

                                          --
                                          Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                                          Terry Pratchett, "Wachen! Wachen!"
                                          ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                                          Veranstaltungsdatenbank Vdb 0.3
                                          1. Hallo Auge,

                                            Das zweite was ich nicht verstehe ist, wie ich php-Funktionen (wie in include), die in einer html eingebunden sein sollen, so einfüge, dass sie eben nicht in dem html markup sind, aber dennoch irgendwie zu dieser gehören. Wie stelle ich eine "Beziehung" zu den Inhalten her?

                                            Ähhh, wasss?

                                            Mir wurde gesagt, dass es nicht zum guten Ton gehört, dass man php code mit html code vermischt. Deshalb meine Frage: Wie kann ich z.B. eine Include Funktion (von vielen Bildern, die ich in eine anderen Datei ausgelagert habe) in eine HTML Datei einfügen, sodass aber die Include Funktion NICHT in dem HTML Markup steht?

                                            Tschö, Auge

                                            Grüße,
                                            Simon P.

                                            1. Lieber Simon P.,

                                              Mir wurde gesagt, dass es nicht zum guten Ton gehört, dass man php code mit html code vermischt.

                                              es hat weniger mit "gutem Ton" zu tun, als vielmehr mit praktischen Erfahrungen. Ab einer gewissen Komplexität und einem gewissen Umfang wird solcher Code stark unübersichtlich und schwer wartbar. Damit ist es "schlechter Stil" im Sinne von "unpraktisch", "ungelenk", "umständlich" und nicht von "unflätig", "unhöflich" oder gar "beleidigend".

                                              Liebe Grüße,

                                              Felix Riesterer.

                                              --
                                              "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                              1. Hallo Felix,

                                                es war mir schon bewusst, was gemeint ist. Ich möchte damit auch niemaden in die Ecke drängen. Mir war es nur nicht bewusst, wieso... jetzt habe ich meine Antwort... und da ich gerne "sauber" arbeite, alles mögliche trennen möchte (was zu trennen geht [Der Ordnung halber]), werde ich weiterhin versuchen, meine bisher nicht optimale Website so umzusetzen, dass es gut getrennt ist, aber dennoch gleich aussieht, wie es am Anfang war. Das ist mein erstes Ziel. Ich weiß, du hast erwähnt, dass man am Anfang nicht auf das Design achten soll, aber warum soll ich von 0 wieder anfangen meine Seite aufzubauen. Ich werde erstmal weiterhin versuchen meine alten Seiten mit dem neuen template Prinzip aufzubauen. Ich mache das gerade hobby-technisch. Es ist also bis jetzt kein großes Projekt, wo ich die Übersichtlichkeit verlieren werde (deshalb auch die vielen IDs und Class's).
                                                So ich werkel mal weiter dran, mal schauen was sich so machen lässt. Bis dann...

                                                Liebe Grüße
                                                Simon P.

                                            2. Mir wurde gesagt, dass es nicht zum guten Ton gehört, dass man php code mit html code vermischt. Deshalb meine Frage: Wie kann ich z.B. eine Include Funktion (von vielen Bildern, die ich in eine anderen Datei ausgelagert habe) in eine HTML Datei einfügen, sodass aber die Include Funktion NICHT in dem HTML Markup steht?

                                              Warum sollte man bitte HTML und PHP Code nicht mischen, die Leute die das sagen bzw. behaupten haben den ganzen Tag nichts besseres zu tun. Schau dir mal große CMS Systeme wie z.B. Joomla, Typo oder Contao an. Hier findest du ÜBERALL HTML und PHP gemischt.

                                              Auch Inline CSS Code wird sehr oft verwendet, hier wird gesagt dieses sollte man nicht machen, aber hey scheiß drauf, solange es überall gut aussieht ist es doch egal wie ein Quelltext aussieht.

                                              In der heutigen Zeit muss eine Umsetzung schnell erledigt werden, denn Zeit ist Geld. Es wird auch behauptet dass ein Code 100% valide sein soll, auch hier kann ich nur sagen, schau dir große Systeme oder große Webseiten an, die sind zu 99,9% nicht valide und die Programmierer bzw. Inhaber scheißen drauf was ein validator sagt.

                                              1. Lieber Martin_Online,

                                                eine "saubere" Argumentation leistest Du Dir hier... Vielleicht solltest Du eine Sommerpause hier im Forum einlegen, denn die Qualität Deiner Beiträge scheint für mich auf einem Rekord-Tief angelangt zu sein. Mag ja beruflich verursacht sein - ich schließe mich da nicht aus ("FEEEEEEERIEEEEEEN!!!"). :-)

                                                Liebe Grüße,

                                                Felix Riesterer.

                                                --
                                                "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                1. eine "saubere" Argumentation leistest Du Dir hier... Vielleicht solltest Du eine Sommerpause hier im Forum einlegen, denn die Qualität Deiner Beiträge scheint für mich auf einem Rekord-Tief angelangt zu sein. Mag ja beruflich verursacht sein - ich schließe mich da nicht aus ("FEEEEEEERIEEEEEEN!!!"). :-)

                                                  Wieso ist doch war, was ich geschrieben habe. Hier im Forum wird immer wieder geschrieben:

                                                  • mach das so
                                                  • so ist es besser
                                                  • die haben keine Ahnung
                                                  • was da geschrieben ist Müll
                                                  • das was ich sage das stimmt

                                                  blablabla! Schau dir mal große und Namenhafte Seiten an, die sind zu 99,9 % nicht valide und interessiert es jemanden? Keine Sau nicht mal die Suchmaschinen.

                                                  Hier wird geschrieben ein Design muss sich dynamisch an Bildschirmgrößen anpassen, warum bekommen die Betreiber von SELFHTML es nicht hin das Forum Design so anzupassen dass es überall gut aussieht? Hier sind doch angeblich ach so tolle Webentwickler die von allem eine Ahnung haben bekommen es aber NICHT hin das Forum endlich mal so zu überarbeiten, dass man es mit dem Handy optimal benutzen kann.

                                                  1. Mahlzeit,

                                                    Schau dir mal große und Namenhafte Seiten an, die sind zu 99,9 % nicht valide und interessiert es jemanden? Keine Sau nicht mal die Suchmaschinen.

                                                    Ist dir schonmal in den Sinn gekommen, dass diese namhaften Seiten es gar nicht nötig haben, diesen Aufwand zu betreiben?
                                                    Aber die kleinen Seiten, die müssen um jeden Besucher kämpfen. Wenn du glaubst, deine Seite ist auf dem Level einer namhaften Seite und dadurch sind die Tips hier für dich nicht relevant, ist das natürlich deine Sache. Ob das von dir klug ist, darüber dürfte man dann allerdings streiten können ;)

                                                    Hier wird geschrieben ein Design muss sich dynamisch an Bildschirmgrößen anpassen, warum bekommen die Betreiber von SELFHTML es nicht hin das Forum Design so anzupassen dass es überall gut aussieht?

                                                    Schonmal dran gedacht, dass in einem Forum auch Tipps gegeben werden, die in diesem Forum (noch) nicht umgesetzt sind? Wenn es dich stört, ich glaub, niemand hat was dagegen, wenn du deine Mithilfe anbietest :)

                                                    Hier sind doch angeblich ach so tolle Webentwickler die von allem eine Ahnung haben bekommen es aber NICHT hin das Forum endlich mal so zu überarbeiten, dass man es mit dem Handy optimal benutzen kann.

                                                    Wie kommst du drauf, dass jeder Fachmann hier

                                                    1. beim Forum mitarbeitet
                                                    2. die nötige Zeit aufbringen kann?

                                                    IdR müssen die Menschen hier auch einer Arbeit nachgehen, um Geld zu verdienen. Und Fachleute haben idR viel Arbeit weil sie gefragt am Markt sind. Damit kannst du dir evtl. weitere Fragen selbst beantworten.

                                                    Ob es überhaupt Sinn macht, für jemanden, wie dich, der sich aktuell so benimmt, das Forum zu verbessern, kann diskutiert werden SCNR

                                                    --
                                                    42
                                                    1. Hallo Leute,

                                                      ich habe trotz der freien Formulierungen von Martin_Online den Sinn dahinter verstanden und ich verstehe auch den Standpunkt von ihm. Ich denke irgendwann entwickelt jeder seinen eigenen Stil etwas zu erarbeiten. Man sollte halt nur auf dem Stil achten, wenn man selber merkt, es wird einem selber unübersichtlich oder wenn man mit mehreren an etwas arbeitet. Manche finden halt die Sachen besser in einem Haufen (Ludolfs...) und andere die brauchen das ordentlich strukturiert in vielen Regalen.

                                                      Ist etwas heiß heute gewesen, kurz runterkommen und alles ist wieder schick.

                                                      Liebe Grüße
                                                      Simon P.

                                            3. Mahlzeit,

                                              Mir wurde gesagt, dass es nicht zum guten Ton gehört, dass man php code mit html code vermischt.

                                              Du musst das anders sehen: Du _willst_ HTML und PHP gar nicht mischen. Warum?
                                              Ganz einfach: Bei einem kleinen Projekt mit 3-5 Scripts ist das kein Problem. Wenn du aber mal ne Datenbank dazuklemmst, dynamische Inhalte oder auch nur einen grossen Projektumfang bekommst, wirst du die Trennung zu schätzen wissen.

                                              Es geht dabei um Wartbarkeit und Wiederverwendbarkeit. In Verbindung mit einer Template-Engine (wobei ein Template eine eigene PHP-Datei sein kann) kannst du die gleichen Scripts auf mehreren Projekten verwenden und einfach durch den Austausch der Templates das Design ändern ohne den eigentlichen PHP-Code anfassen zu müssen.

                                              --
                                              42
                                        2. Lieber Simon P.,

                                          Meine Index

                                          schade, diese Datei hat mit unserem erarbeiteten Prinzip absolut nichts mehr zu tun. Sie vermischt nicht nur HTML mit PHP-Einschüben, sie ist auch noch darauf angewiesen, dass der Server HTML-Dateien nach PHP-Inhalten parst - ein in meinen Augen sehr fragwürdiger Ansatz.

                                          Es ist umso mehr schade, dass Du nicht versuchst, den von mir beschriebenen Weg intensiver zu testen und damit Deine Erfahrungen zu verbreitern, sondern schon wieder etwas "neues" versuchst, ohne recht zu verstehen, was Du überhaupt tust. Aber wenn Du so lernen willst... bitte schön.

                                          Liebe Grüße,

                                          Felix Riesterer.

                                          --
                                          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                          1. Hallo Felix,

                                            vielleicht habe ich es vergessen zu sagen. So habe meine Seite aufgebaut gehabt, bevor ich dein Lösungsvorschlag bekommen habe. Ich habe nun verusucht, meine bisherige Seite (Seitenaufbau mit Menüs und ähnliches) auf das Prinzip zu übertragen. Mir fehlt aber das Wissen um das zu ermöglichen. Wie z.B. kann ich in einer einzigen HTML Datei mehrere $contents (z.B. Menü der Seite und den eigentlichen Inhalt) reinschreiben, die dann an verschiedenen Stellen in das Template eingefügt werden?
                                            Ich habe die letzten Tage kein einziges mal an meiner bisherigen Seite gearbeitet. Ich habe ausschließlich versucht dein Prinzip auf meine bisherige Seite zu übertragen. Damit du ungefähr verstehst, wie meine Seite aufgebaut ist, habe ich dir meine Index zum Download bereitgestellt. Ich möchte wirklich besser mit PHP umgehen lernen, aber ich selber komme einfach nicht auf die Ideen, wie ich das Anstelle und was es alles für Möglichkeiten mit PHP gibt. Wie dein Prinzip funktioniert verstehe ich. Aber es fängt schon an zu haken, wenn ich z.B. 2 verschiedene HTML Seiten in ein Template einbinden möchte, denn dann muss ja nicht nur eine $pages eingefügt werden, sondern noch eine zweite. Das heißt, meine URL muss sich ?irgendwie? erweitern. Das habe ich dann gelesen, wie man mehrere Variablen in der $_GET Methode übergibt. Habe es dann auch getestet, hat aber nicht funktioniert.So sah das dann aus

                                            z.B. Link zum "kontakt" mit Navigation der HTML "Kontakt"

                                            ...href="?p=contact&n=contact_navi"

                                            in der PHP habe ich dann noch ein zweites array mit allen Navigationen eingefüt und eine zweite if Schleife, damit genau das selbe passiert, was auch mit dem $content passiert, halt nur mit dem Navi, hat aber aus einem Grund nicht funktioniert, leider kenn ich den Grund nicht. Nun frage ich mich, ob es noch einen einfacheren Weg gibt um mehrere $contents an verschiedenen Stellen in ein Template bei einem Seitenaufruf einzubinden. Wenn in den HTML-Dateien kein PHP code stehen soll, wie kann ich dann z.B. eine Include Funktion (die z.B. nur auf einer bestimmten HTML Seite gehört) in diese Einfügen, ohne diese in das Markup der HTML-Datei einzufügen?
                                            Ich glaube einfach, dass mir noch sehr viel Wissen über die Möglichkeiten von PHP fehlt, weswegen ich selber nicht auf die Ideen komme, um das was ich machen möchte zu verwirklichen. Denn eine "einfache" Seite mit einem Content und ein paar statischen Inhalten (so wie dein Beispiel), das bekomm ich hin.

                                            Liebe Grüße
                                            Simon P.

                                            1. Lieber Simon P.,

                                              z.B. Link zum "kontakt" mit Navigation der HTML "Kontakt"

                                              ...href="?p=contact&n=contact_navi"

                                              wenn die Navigation in Abhängigkeit zur aktuellen Seite steht, warum steht dann das, was die Navigation sein soll, nicht in der HTML-Datei zu der Seite?

                                              Angenommen, Du willst eine Art Subnavi umsetzen. Warum kannst Du diese nicht in Deine jeweilige HTML-Datei schreiben? Dein PHP-Script (index.php) könnte diese eventuell "ausschneiden" und an einer passenderen Stelle im Template wieder "pasten". Wie das genau geht, hängt davon ab, wie fortgeschritten man soetwas implementieren möchte.

                                              hat aber aus einem Grund nicht funktioniert, leider kenn ich den Grund nicht.

                                              Fehlerbeschreibungen enthalten wenigstens den Wortlaut von Fehlermeldungen und/oder eine Beschreibung des Unterschieds zwischen Soll- und Ist-Zustand. [Tipps für Fragende]

                                              Nun frage ich mich, ob es noch einen einfacheren Weg gibt um mehrere $contents an verschiedenen Stellen in ein Template bei einem Seitenaufruf einzubinden.

                                              Deine Platzhalter sind nach einem bestimmten Schema aufgebaut: {$name-des-platzhalters}. Es ist durchaus denkbar, dass verschiedene PHP-Scripte unterschiedliche Platzhalter suchen und ersetzen wollen.

                                              Wenn in den HTML-Dateien kein PHP code stehen soll, wie kann ich dann z.B. eine Include Funktion (die z.B. nur auf einer bestimmten HTML Seite gehört) in diese Einfügen, ohne diese in das Markup der HTML-Datei einzufügen?

                                              Ich erinnere daran, dass Dein index.php-Script einen Bereich enthält, in den Du weitere "externe" PHP-Scripte includierst, die ihrerseits zuerst prüfen, für welche Seite sie jetzt aktiv werden sollen...

                                              Ich glaube einfach, dass mir noch sehr viel Wissen über die Möglichkeiten von PHP fehlt, weswegen ich selber nicht auf die Ideen komme, um das was ich machen möchte zu verwirklichen. Denn eine "einfache" Seite mit einem Content und ein paar statischen Inhalten (so wie dein Beispiel), das bekomm ich hin.

                                              Ja, manchmal braucht es eine Weile und Erfahrung, um auf Ideen zu kommen. Glaube mir, Du hast schon die wesentlichen Zutaten beisammen, um damit weitreichend Deine Seite umsetzen zu können.

                                              Liebe Grüße,

                                              Felix Riesterer.

                                              --
                                              "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                              1. Hallo Felix,

                                                ich habe nun einen weiteren Teil gelöst. Ich kann nun Teile aus meiner HTML ausschneiden und in die Template einfügen.
                                                Dennoch habe ich immernoch das Problem, dass ich noch nicht ganz dahinter gekommen bin wie ich meine weiteren PHP-Scripte (wie Datenbankabfragen) !!!an der richtigen Stelle!!! in eine HTML Seite einbinde (in der index.php) ohne für eine Seite, dass Template zu verändern. Das wiederum heißt im Umkehrschluss, dass ich entweder einen Befehl in die index.php schreiben muss um die HTML Datei anzupassen oder dass ich einen Befehl in die Index PHP eingeben muss der der Template sagt, wohin das php-script ausgeführt werden soll.

                                                *Kopf-rauch*

                                                Liebe Grüße
                                                Simon P.

                                                PS: z.B. das:

                                                  
                                                <?php  
                                                     echo date("d.m.Y, H:i:s", filemtime("animes.html"));  
                                                ?>  
                                                
                                                

                                                1. Lieber Simon P.,

                                                  immer wieder nachschauen, wie die Logik des jeweiligen Programmablaufs beschaffen ist... ja, das ist anstrengend. Für Anfänger mögen Flussdiagramme manchmal helfen, um den Ablauf besser zu verdeutlichen.

                                                  Wir hatten doch schon eine Vorrichtung in index.php eingebaut, die Zusatzscripte inkludiert - und zwar alle(!), damit diese wiederum selbst entscheiden können, inwiefern sie nun aktiv werden und was sie dann tun wollen.

                                                  Ein solches Zusatzscript beginnt nach oben verlinktem Schema mit einer if-Anweisung, in der geprüft wird, ob das Script auf die richtige Seite hin reagiert:

                                                  <?php  
                                                    
                                                  // we react to "?p=serien" in the URL  
                                                  if (array_key_exists('p', $_GET) && 'p' == 'serien') {
                                                  

                                                  Natürlich kannst Du auch für andere Seiten Scripts entwickeln, die dann dort besondere Funktionalitäten umsetzen.

                                                  PS: z.B. das:

                                                  <?php

                                                  echo date("d.m.Y, H:i:s", filemtime("animes.html"));
                                                  ?>

                                                    
                                                  Ich gehe jetzt davon aus, dass Du gerade nicht für \_jede\_ Seite ein solches Datum ausgeben willst. Wolltest Du das doch, könntest Du in Deinem Template einen passenden Platzhalter einsetzen (z.B. {$mtime}) und mit folgendem Code befüllen:  
                                                    
                                                  ~~~php
                                                  // put it all together  
                                                  $tmp = str_replace(  
                                                      array('{$contents}', '{$news}', '{$mtime}'),  
                                                      array(  
                                                          $contents,  
                                                          $news,  
                                                          date('d.m.Y, H:i:s', filemtime('./pages/'.$pages[$_GET['p']])  
                                                      ),  
                                                      $tmp  
                                                  );
                                                  

                                                  Das führt aber zu einem Fehlerfall, wenn der p-Parameter in der URL einen fremden Schlüssel enthält. Bei einem Aufruf mit "?p=unsinn" würde $_GET['p'] den Wert "unsinn" haben und bei filemtime() im Array $pages einen Schlüssel "unsinn" voraussetzen, den es aber nicht gibt. Daher schlage ich folgende Verbesserung an der index.php vor:

                                                  <?php  
                                                    
                                                  // list of pages  
                                                  $pages = array(  
                                                      'contact' => 'contact.html',  
                                                      'home'    => 'home.html'  
                                                      //... weitere Seiten?  
                                                  );  
                                                    
                                                  $p = 'home'; // default page  
                                                    
                                                  // specific page requested?  
                                                  if (array_key_exists('p', $_GET)  
                                                      // do we have such a page?  
                                                      && array_key_exists($_GET['p'], $pages)  
                                                  ) {  
                                                      $p = $_GET['p'];  
                                                  }  
                                                    
                                                  // load page contents  
                                                  $contents = file_get_contents('./pages/'.$pages[$p]);  
                                                    
                                                  // get template  
                                                  $tmp = file_get_contents('./pages/template.html');  
                                                    
                                                  // get news  
                                                  $news = file_get_contents('./pages/news.html');  
                                                    
                                                  // put it all together  
                                                  $tmp = str_replace(  
                                                      array('{$contents}', '{$news}', '{$mtime}'),  
                                                      array(  
                                                          $contents,  
                                                          $news,  
                                                          date(  
                                                              'd.m.Y, H:i:s',  
                                                              filemtime('./pages/'.$pages[$p]  
                                                          )  
                                                      ),  
                                                      $tmp  
                                                  );  
                                                    
                                                  // include additional scripts  
                                                  include 'serien.php'; // for ?p=serien  
                                                    
                                                  // send everything to the browser  
                                                  echo $tmp;  
                                                    
                                                  ?>
                                                  

                                                  Angenommen, Du willst nur von einer speziellen Seite das Datum angeben. Dann ist das bestimmt wieder ein Fall für ein spezialisiertes Zusatzscript. Du hattest etwas von "animes.html" geschrieben. Dann erstelle doch ein PHP-Script "animes.php", welches Du in index.php ebenfalls includierst:

                                                  // include additional scripts  
                                                  include 'animes.php'; // for ?p=animes  
                                                  include 'serien.php'; // for ?p=serien
                                                  

                                                  In "animes.php" gehst Du dann analog zu "serien.php" vor:

                                                  <?php  
                                                    
                                                  // we react to "?p=animes" in the URL  
                                                  if (array_key_exists('p', $_GET) && 'p' == 'animes') {  
                                                      // do something here  
                                                  }  
                                                    
                                                  ?>
                                                  

                                                  Sollte also der Platzhalter "{$mtime}" nur in der HTML-Datei "animes.html" stehen (und nicht im Template in "template.html"), dann könnte dieses spezialisierte Zusatzscript diesen mit dem passenden Datum ersetzen:

                                                  <?php  
                                                    
                                                  // we react to "?p=animes" in the URL  
                                                  if (array_key_exists('p', $_GET) && 'p' == 'animes') {  
                                                      $tmp = str_replace(  
                                                          '{$mtime}',  
                                                          date(  
                                                              'd.m.Y, H:i:s',  
                                                              filemtime('./pages/animes.html')  
                                                          ),  
                                                          $tmp  
                                                      );  
                                                  }  
                                                    
                                                  ?>
                                                  

                                                  Da str_replace() keine Veränderungen vornimmt, wenn es das zu Ersetzende nicht findet, wäre die "generelle" Datumslösung weiter oben (mit {$mtime} in "template.html") vielleicht sinnvoller.

                                                  Liebe Grüße,

                                                  Felix Riesterer.

                                                  --
                                                  "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                  1. Hallo Felix,

                                                    ich habe mal versucht Irgendwas zu includieren, auch wenn ich in die Datum.php nur das mache:

                                                      
                                                    <?php  
                                                    	date('d.m.Y, H:i:s', filemtime('./pages/'.$pages[$_GET['p']]));  
                                                    ?>  
                                                    
                                                    

                                                    und in die index.php dann einfach das hinzufüge:

                                                      
                                                    $tmp = str_replace(  
                                                        array('$contents', '$news', '$nav', '$head', '$mtime'),  
                                                        array($contents, $news, $nav, $head, include("script_date.php")),  
                                                        $tmp  
                                                    );  
                                                    
                                                    

                                                    Der Fehlercode von apache/logs/error.log sieht dann wie folgt aus:

                                                    [Mon Jul 28 13:48:27.098617 2014] [include:error] [pid 5000:tid 1664] [client 127.0.0.1:51060] unable to include potential exec "include/top.html" in parsed file D:/HTML__/Xampp/apache/error/HTTP_NOT_FOUND.html.var, content type not text/*, referer: http://localhost/homepage/index.php?p=home
                                                    [Mon Jul 28 13:48:27.099617 2014] [include:error] [pid 5000:tid 1664] [client 127.0.0.1:51060] unable to include potential exec "include/bottom.html" in parsed file D:/HTML__/Xampp/apache/error/HTTP_NOT_FOUND.html.var, content type not text/*, referer: http://localhost/homepage/index.php?p=home

                                                    Anscheinend will er nur HTML includieren (oder verstehe ich das falsch?). Aufjedenfall zeigt er, wenn ich das so mache wie ich eben oben geschrieben habe, nur eine '1' an. Dein Vorschlag mit dem generellen Datum funktioniert leider nicht, liegt wohl an meinem System des "ein- und ausschneidens" was wie folgt aussieht:

                                                      
                                                    $line = "<!-- HEADaf"; //Die Startposition in der HTML  
                                                    $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String  
                                                        $head = substr($head, $anf); //Vom Anfang wird nun ausgegben  
                                                    $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn  
                                                        $head = substr($head, 0, $end); //Dort hört es auf, auszugeben  
                                                      
                                                    $line2 = "<!-- NAVaf";  
                                                    $anf2 = strpos($nav, $line2);  
                                                        $nav = substr($nav, $anf2);  
                                                    $end2 = strpos($nav, "<!-- NAVe -->");  
                                                        $nav = substr($nav, 0, $end2);  
                                                      
                                                    $line3 = "<!-- MAINaf";  
                                                    $anf3 = strpos($contents, $line3);  
                                                        $contents = substr($contents, $anf3);  
                                                    $end3 = strpos($contents, "<!-- MAINe -->");  
                                                        $contents = substr($contents, 0, $end3);  
                                                    
                                                    

                                                    Es funktioniert so (noch nicht perfekt verstanden). Aber wenn ich dein generellen Vorschlag annehme, dann funktioniert es nicht mehr. Ich hatte auch mal versucht meine Datenbank zu includieren, aber es wir einfach alles ganz an den Anfang des Dokumentes gesetzt.

                                                    Wenn ich die Zeit so einsetze:

                                                      
                                                    $tmp = str_replace(  
                                                        array('$contents', '$news', '$nav', '$head', '$mtime'),  
                                                        array($contents, $news, $nav, $head, date('d.m.Y, H:i:s', filemtime('./pages/'.$pages[$_GET['p']]))),  
                                                        $tmp  
                                                    );  
                                                    
                                                    

                                                    Dann funktioniert alles mit der Zeit. Mich wundert nur, was da mit dem Includieren nicht stimmt.

                                                    man müsste ja im Prinzip auch includes in der index.php in eine Variable schreiben können und die dann abrufen können oder? Aber es funktioniert nicht.
                                                    Also so:

                                                      
                                                    $mtime = include("date.php");  
                                                    
                                                    

                                                    Hab ich wiedermal was übersehen?

                                                    Liebe Grüße
                                                    Simon P.

                                                    1. Hallo Felix,

                                                      ich habe mir eben mein Post nocheinmal durchgelesen, da war ich nicht betrunken, auch wenn es sich so ließt. Deine Vorschläge habe ich natürlich als erstes Versucht (includes vor das "echo" usw.). Das funktionierte auch nicht... da passierte einfach nichts, weder Fehlermeldung im Browser noch irgendwas anderes. Im Log steht immer nur das gleiche.

                                                      Liebe Grüße
                                                      Simon P.

                                                    2. Lieber Simon P.,

                                                      ich habe mal versucht Irgendwas zu includieren, auch wenn ich in die Datum.php nur das mache:

                                                      "irgendwas" ist meistens falsch. Wenn Du nicht genau weißt, was Du tust, dann läufst Du Gefahr, dass unvorhersehbare Dinge geschehen, denn die Abarbeitung des Codes folgt der Logik der PHP-Sprache, und dann heißt es "works as designed" oder "garbage in, garbage out".

                                                      <?php

                                                      date('d.m.Y, H:i:s', filemtime('./pages/'.$pages[$_GET['p']]));
                                                      ?>

                                                        
                                                      Dieser Code sorgt dafür, dass \_sofort\_ Daten an den Browser gesendet werden. Das bedeutet, dass der vom Browser empfangene HTML-Code mit dieser Datumsangabe beginnt... noch vor einem <!DOCTYPE...> oder <html>-Element. Das willst Du nicht. Du willst ein HTML-Dokument mit möglichst validem Code.  
                                                        
                                                      Das Prinzip, dass ich Dir nahelegen wollte, sammelt erst allen HTML-Code, um ihn am Ende(!) komplett(!!) an den Browser zu senden. Und das habe ich nicht zufällig oder aus Bequemlichkeit so vorgeschlagen, sondern aus der Erfahrung heraus, dass manchmal im Code Dinge unmöglich werden, wenn bereits Teile des zusammenzusetzenden HTML-Codes an den Browser versandt wurden. Das hat insbesondere im Zusammenhang mit meinem GB-Script immer wieder zu Hilfe-Anfragen geführt, weil Leute HTML-Code schon ausgegeben hatten, bevor sie mein Script includiert hatten.  
                                                        
                                                      
                                                      > und in die index.php dann einfach das hinzufüge:  
                                                      >   
                                                      > ~~~php
                                                      
                                                      $tmp = str_replace(  
                                                      
                                                      >     array('$contents', '$news', '$nav', '$head', '$mtime'),  
                                                      >     array($contents, $news, $nav, $head, include("script_date.php")),  
                                                      >     $tmp  
                                                      > );
                                                      
                                                      

                                                      Prüfen wir einmal die Logik hinter diesem Code. Die include-Anweisung sorgt dafür, dass ein Code-Schnipsel an exakt der Stelle eingefügt wird, an der sie steht. Aus Deinem obigen Code entsteht nach dem Inkludieren folgendes Konstrukt:

                                                      $tmp = str_replace(  
                                                          array('$contents', '$news', '$nav', '$head', '$mtime'),  
                                                          array($contents, $news, $nav, $head, date('d.m.Y, H:i:s', filemtime('./pages/'.$pages[$_GET['p']]))),  
                                                          $tmp  
                                                      );
                                                      

                                                      Das mag in diesem Fall vielleicht sogar zu sinnvollem Code führen, ist aber hochgradig fehleranfällig, denn wie sehe ich einem Script an, dass es im Wesentlichen nur eine Variable mit einem Wert befüllen soll, damit dieser dann als Ersatz für diese verwendet werden kann? Vergleiche folgende beiden Beispiele:

                                                      <?php  
                                                      $a = '';  
                                                        
                                                      include 'a.php'; // sets $a to a string value e.g. $a = "hello world!";  
                                                        
                                                      $b = include('b.php'); // date('d.m.Y')  
                                                        
                                                      echo "$b: $a";  
                                                        
                                                      ?>
                                                      

                                                      Solcherlei include-Anweisungen (wie hier bei $b) sind in meinen Augen nicht sinnvoll. Mach' es lieber so, wie ich es Dir mit dem Einbinden von spezialisierten Zusatzscripts vorgeschlagen habe. Da sieht man auf den ersten Blick, dass da umfangreicherer PHP-Code kommt, der nicht nur einen Wert ermittelt, damit man die include-Anweisung ersatzweise für einen Variablennamen notieren kann.

                                                      Der Fehlercode von apache/logs/error.log sieht dann wie folgt aus:

                                                      [Mon Jul 28 13:48:27.098617 2014] [include:error] [pid 5000:tid 1664] [client 127.0.0.1:51060] unable to include potential exec "include/top.html" in parsed file D:/HTML__/Xampp/apache/error/HTTP_NOT_FOUND.html.var, content type not text/*, referer: http://localhost/homepage/index.php?p=home
                                                      [Mon Jul 28 13:48:27.099617 2014] [include:error] [pid 5000:tid 1664] [client 127.0.0.1:51060] unable to include potential exec "include/bottom.html" in parsed file D:/HTML__/Xampp/apache/error/HTTP_NOT_FOUND.html.var, content type not text/*, referer: http://localhost/homepage/index.php?p=home

                                                      Ist das jetzt wirklich so überraschend? Die Fehlermeldungen scheinen davon zu handeln, dass der Parser nicht includieren kann, weil er nicht sicher ist, dass es sich nur um simplen Text handelt, den er so einbinden kann, wie er ist. Es könnte ja zu parsender PHP-Code enthalten sein, der vom Parser an dieser Stelle anscheinend nicht geparst werden kann. Das mag eine Folge Deiner Server-Konfiguration sein, die HTML-Dokumente als zu parsende PHP-Scripte ermöglicht.

                                                      Dein Vorschlag mit dem generellen Datum funktioniert leider nicht,

                                                      Deine Fehlerbeschreibung ist leider keine. Aber immerhin lieferst Du einen Code-Schnipsel, den es sich anzuschauen lohnt, sodass wir doch vielleicht weiter kommen:

                                                      $line = "<!-- HEADaf"; //Die Startposition in der HTML

                                                      $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String
                                                          $head = substr($head, $anf); //Vom Anfang wird nun ausgegben
                                                      $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn
                                                          $head = substr($head, 0, $end); //Dort hört es auf, auszugeben

                                                      $line2 = "<!-- NAVaf";
                                                      $anf2 = strpos($nav, $line2);
                                                          $nav = substr($nav, $anf2);
                                                      $end2 = strpos($nav, "<!-- NAVe -->");
                                                          $nav = substr($nav, 0, $end2);

                                                      $line3 = "<!-- MAINaf";
                                                      $anf3 = strpos($contents, $line3);
                                                          $contents = substr($contents, $anf3);
                                                      $end3 = strpos($contents, "<!-- MAINe -->");
                                                          $contents = substr($contents, 0, $end3);

                                                        
                                                      Na, das hat mit meinem Code nun überhaupt nichts mehr zu tun. Warum nimmst Du keine Platzhalter? Gibt es einen Grund, warum Du hier umständlich nach Anfang und Ende von etwas suchst?  
                                                        
                                                      Auch ich habe schon HTML-Kommentare dazu benutzt, Inhalte dort einzufügen, oder ganze Teile "wegzuschneiden". Grundsätzlich ist das schon clever. Aber auch schwieriger. Da eignen sich meiner Meinung nach bald schon diese extrem coolen regulären Ausdrücke, mit denen solche Ersetzungen fast als Einzeiler möglich sind. Aber ist das in Deinem Projekt jetzt an dieser Stelle notwendig? Was genau willst Du eigentlich erreichen?  
                                                        
                                                      
                                                      > Es funktioniert so (noch nicht perfekt verstanden). Aber wenn ich dein generellen Vorschlag annehme, dann funktioniert es nicht mehr.  
                                                        
                                                      Wiebitte? Bratwurst mit Abfahrt?  
                                                        
                                                      
                                                      > Ich hatte auch mal versucht meine Datenbank zu includieren, aber es wir einfach alles ganz an den Anfang des Dokumentes gesetzt.  
                                                        
                                                      Das könnte damit zu tun haben, dass Du Funktionen benutzt, deren Rückgabewert Du nicht in einer Variablen speicherst, sodass deren Rückgabewert sofort an den Browser gesendet werden (siehe weiter oben).  
                                                        
                                                      
                                                      > man müsste ja im Prinzip auch includes in der index.php in eine Variable schreiben können und die dann abrufen können oder? Aber es funktioniert nicht. [...]  
                                                      > `$mtime = include("date.php");`{:.language-php}  
                                                        
                                                      Zuerst initialisierst Du eine Variable, dann includierst Du ein Script, das diese Variable mit einem anderen Wert überschreiben soll:  
                                                        
                                                      ~~~php
                                                      $mtime = time(); // now  
                                                        
                                                      include 'mtime.php'; // sets $mtime e.g. $mtime = filemtime('file.php');
                                                      

                                                      Damit erreichst Du, dass das hauptsächliche Script (hier index.php) "ungestört" weiterlaufen kann, auch wenn mtime.php die gewünschte Variable überhaupt nicht kennt und dafür eine andere definiert.

                                                      Hab ich wiedermal was übersehen?

                                                      Du versuchst technische Lösungen für Probleme zu finden, ohne die Natur der Probleme aus PHP-Sicht genau verstanden zu haben. Das ist für Anfänger typisch. Aus genau diesen Fehlern lernt man ja die Denkweise der Programmiersprache kennen und kann daran wachsen.

                                                      Liebe Grüße,

                                                      Felix Riesterer.

                                                      --
                                                      "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                      1. Hallo Felix,

                                                        Der Fehlercode von apache/logs/error.log sieht dann wie folgt aus:

                                                        [Mon Jul 28 13:48:27.098617 2014] [include:error] [pid 5000:tid 1664] [client 127.0.0.1:51060] unable to include potential exec "include/top.html" in parsed file D:/HTML__/Xampp/apache/error/HTTP_NOT_FOUND.html.var, content type not text/, referer: http://localhost/homepage/index.php?p=home [Mon Jul 28 13:48:27.099617 2014] [include:error] [pid 5000:tid 1664] [client 127.0.0.1:51060] unable to include potential exec "include/bottom.html" in parsed file D:/HTML__/Xampp/apache/error/HTTP_NOT_FOUND.html.var, content type not text/, referer: http://localhost/homepage/index.php?p=home

                                                        ... Das mag eine Folge Deiner Server-Konfiguration sein, die HTML-Dokumente als zu parsende PHP-Scripte ermöglicht.

                                                        Das habe ich sofort nachgeschaut, und habe meine alte Veränderung rückgängig gemacht, weil ich sie ja mit deinem System nicht mehr benötige lächel.

                                                        Ich habe in der Apache Config unter dem Punkt: <IfModule mime_module>

                                                        folgendes hinzugefügt gehabt: AddType application/x-httpd-php php php4 php3 html htm

                                                        Anscheinend gibt es das Problem schon öfters. Ich werde mal schauen ob ich eine Fehlerquelle finde, es kann ja nicht sein, dass ich kein Includes mehr benutzen kann -.-; .

                                                        Dein Vorschlag mit dem generellen Datum funktioniert leider nicht,

                                                        Okay, wiedermal habe ich mich schlecht ausgedrückt... ... undzwar ging es um diesen Code-Vorschlag:

                                                        
                                                        <?php
                                                        
                                                        // list of pages
                                                        $pages = array(
                                                            'contact' => 'contact.html',
                                                            'home'    => 'home.html'
                                                            //... weitere Seiten?
                                                        );
                                                        
                                                        $p = 'home'; // default page
                                                        
                                                        // specific page requested?
                                                        if (array_key_exists('p', $_GET)
                                                            // do we have such a page?
                                                            && array_key_exists($_GET['p'], $pages)
                                                        ) {
                                                            $p = $_GET['p'];
                                                        }
                                                        
                                                        // load page contents
                                                        $contents = file_get_contents('./pages/'.$pages[$p]);
                                                        
                                                        // get template
                                                        $tmp = file_get_contents('./pages/template.html');
                                                        
                                                        // get news
                                                        $news = file_get_contents('./pages/news.html');
                                                        
                                                        // put it all together
                                                        $tmp = str_replace(
                                                            array('{$contents}', '{$news}', '{$mtime}'),
                                                            array(
                                                                $contents,
                                                                $news,
                                                                date(
                                                                    'd.m.Y, H:i:s',
                                                                    filemtime('./pages/'.$pages[$p]
                                                                )
                                                            ),
                                                            $tmp
                                                        );
                                                        
                                                        // include additional scripts
                                                        include 'serien.php'; // for ?p=serien
                                                        
                                                        // send everything to the browser
                                                        echo $tmp;
                                                        
                                                        ?>
                                                        
                                                        

                                                        ... Ich habe nach einer Möglichkeit gesucht, Mehrere Inhalte wegen meiner Subnavi an unterschiedlichen Stellen ein und auszuschneiden. So kam ich auf dieses konstruckt ->>

                                                        $line = "<!-- HEADaf"; //Die Startposition in der HTML
                                                        
                                                        > > $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String
                                                        > >     $head = substr($head, $anf); //Vom Anfang wird nun ausgegben
                                                        > > $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn
                                                        > >     $head = substr($head, 0, $end); //Dort hört es auf, auszugeben
                                                        > > 
                                                        > > $line2 = "<!-- NAVaf";
                                                        > > $anf2 = strpos($nav, $line2);
                                                        > >     $nav = substr($nav, $anf2);
                                                        > > $end2 = strpos($nav, "<!-- NAVe -->");
                                                        > >     $nav = substr($nav, 0, $end2);
                                                        > > 
                                                        > > $line3 = "<!-- MAINaf";
                                                        > > $anf3 = strpos($contents, $line3);
                                                        > >     $contents = substr($contents, $anf3);
                                                        > > $end3 = strpos($contents, "<!-- MAINe -->");
                                                        > >     $contents = substr($contents, 0, $end3);
                                                        
                                                        

                                                        Ich als Anfänger möchte natürlich irgendwie auch verstehen, was ich mache, damit ich einerseits neues dazulerne und anderseits das hinbekomme, was ich gerne hinbekommen möchte. Ich weiß natürlich nicht, ob das so eine schöne Lösung ist, aber ich verstehe was passiert. Die eingebundene HTML wird in 3 Variablen eingebunden:

                                                        
                                                        if (array_key_exists("p", $_GET) // Gibt es in der Superglobalen Variable $_GET einen Schlüssel p ?
                                                            && array_key_exists($_GET["p"], $pages) // Und gibt es in dem Schlüssel eine Seite aus dem Array $pages ?
                                                        ) {
                                                            $contents = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                            $nav = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                            $head = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                        }	// Wenn beides "True", lade die gewünschte Seite in die Variable $contents etc.
                                                        
                                                        

                                                        ... Jetzt wird mit dem Code von oben jedes dieser Elemente "beschnitten". Bei $head wird z.B. von oben angefangen und der Rest unten abgeschnitten. Kommentare habe benutzt, damit man 1. weiß wo es anfängt und aufhört mit der "Beschneidung" und 2. Damit im Browser nichts gesehen wird. Hinter das komplette Prinzip bin ich noch nicht gekommen, warum der mir hier:

                                                        
                                                        $line = "<!-- HEADaf"; //Die Startposition in der HTML
                                                        $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String
                                                            $head = substr($head, $anf); //Vom Anfang wird nun ausgegben
                                                        $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn
                                                            $head = substr($head, 0, $end); //Dort hört es auf, auszugeben
                                                        
                                                        

                                                        ... bei $line den "Anfang" also <!-- HEADaf mit ausgeben lässt (was zur Folge hatte, dass wenn ich nicht <!-- mit angegeben hatte, er mir den Teil HEADaf mit oben in meine <section> geschrieben hatte). Bei $end allerdings gibt er mir <!-- HEADe --> nicht aus.

                                                        So wie ich gelesen habe, hast du anscheinend schon gewusst, was ich damit mache. Kann ich das so lassen oder kann das zu Fehlern führen? Wie gesagt, die Website hält sich in Maßen, sodass ich denke, dass ich nicht den Überblick verlieren werde. Was meintest du mit "regulären Ausdrücken"? Zum Ein- und Ausschneiden hatte ich nur noch als andere Variante eine Funktion namens preg_match, die ich aber mir nicht weiter angeguckt habe, weil ich sie aus anhieb nicht verstanden habe. Darum habe ich erstmal diese Methode genommen.

                                                        Es funktioniert so (noch nicht perfekt verstanden). Aber wenn ich dein generellen Vorschlag annehme, dann funktioniert es nicht mehr.

                                                        Wiebitte? Bratwurst mit Abfahrt?

                                                        Entschuldige bitte dieses "Beziehen auf das was ich denke, dass du evtl. verstehst, was ich meine" (oder so ähnlich) (^_-) . Damit wollte ich sagen, dass meine Methode mit $line und $end usw., was ich dir obendrüber geschrieben habe, nicht bei deiner neuen Methode funktioniert um generell überall das Datum einzufügen. (der lange Quelltext, ganz oben in meinem Post).

                                                        Das könnte damit zu tun haben, dass Du Funktionen benutzt, deren Rückgabewert Du nicht in einer Variablen speicherst, sodass deren Rückgabewert sofort an den Browser gesendet werden (siehe weiter oben).

                                                        Ja, das dachte ich mir schon und habe auch schon Versuche angestellt... aber es kommt nichts bei raus. Das hier möchte ich in genau einer HTML Datei einfügen:

                                                        
                                                        <?php
                                                            $db = mysqli_connect("localhost", "Benutzer", "Passwort", "homepage");
                                                            if(!$db){
                                                            exit("Verbindungsfehler: ".mysqli_connect_error());
                                                            }
                                                            $db->query("SET NAMES 'utf8'");
                                                        ?>
                                                        <?php
                                                        if (array_key_exists('p', $_GET) && 'p' == 'animes_geschaut') {
                                                        
                                                            $ergebnisAnfang = 0;
                                                            $result = mysqli_query($db, "SELECT Name_Japanisch, ID, Name_Roomaji, Genre, Datum, Bewertung, Typ, Episoden FROM animes");
                                                            while($row = mysqli_fetch_object($result))
                                                            {
                                                                $data .= sprintf(
                                                                '<li><h2>' ."$row->ID. $row->Name_Roomaji". '<a href="#' ."$row->ID".'">Details</a></h2>
                                                                <dl id="' ."$row->ID". '">
                                                                <dt>Name Japanisch:</dt>
                                                                <dd>' ."$row->Name_Japanisch". '</dd>
                                                                <dt>Genre:</dt>
                                                                <dd>' ."$row->Genre". '</dd>
                                                                <dt>Geschaut am:</dt>
                                                                <dd>' ."$row->Datum". '</dd>
                                                                <dt>Bewertung:</dt>
                                                                <dd>' ."$row->Bewertung". '</dd>
                                                                <dt>Typ:</dt>
                                                                <dd>' ."$row->Typ". '</dd>
                                                                <dt>Episoden:</dt>
                                                                <dd>' ."$row->Episoden". '</dd>
                                                                <dd><a href="#c1" id="c1">x</a></dd>
                                                                </dl>
                                                                </li>');
                                                                if($row->Name_Roomaji == "Das Verschwinden der Haruhi Suzumiya")
                                                                {
                                                                    $ergebnisNeu = 161;
                                                                }
                                                                else if($row->Name_Roomaji == "Saishuuheiki Kanojo: Another Love Song")
                                                                {
                                                                    $ergbnisNeu = $row->Episoden*28;
                                                                }
                                                                else if($row->Name_Roomaji == "Koe de Oshigoto! The Animation")
                                                                {
                                                                    $ergbnisNeu = $row->Episoden*28;
                                                                }
                                                                else if($row->Name_Roomaji == "Boku wa Tomodachi ga Sukunai: Bishoujo ga Zannen na Nioi")
                                                                {
                                                                    $ergebnisNeu = $row->Episoden*11;
                                                                }
                                                                else if($row->Name_Roomaji == "Mangaka-san to Assistant-san to The Animation")
                                                                {
                                                                    $ergebnisNeu = $row->Episoden*13;
                                                                }
                                                                else if($row->Name_Roomaji == "Perfect Blue")
                                                                {
                                                                    $ergebnisNeu = 77;
                                                                }
                                                                else if($row->Name_Roomaji == "Chihiros Reise ins Zauberland")
                                                                {
                                                                    $ergebnisNeu = 120;
                                                                }
                                                                else if($row->Typ == "Film")
                                                                {
                                                                    $ergebnisNeu = 87;
                                                                }
                                                                else
                                                                {
                                                                    $ergebnisNeu = $row->Episoden*22;
                                                                }
                                                                $ergebnis = $ergebnisAnfang + $ergebnisNeu;
                                                                $ergebnisAnfang = $ergebnis;
                                                            }
                                                        
                                                                // $animes_geschaut = file_get_contents('./pages/animes_geschaut.html');
                                                        
                                                                $ergebnis = number_format($ergebnisAnfang/60);
                                                        
                                                                $tmp = str_replace('$database', $data, $tmp);
                                                                $tmp = str_replace('$ergebnis_time', $ergebnis, $tmp);
                                                                // $ergebnis_time = printf('<p id="time">Ich habe <span>'."$ergebnis".' Stunden</span> mit Animegucken verbracht.</p>');
                                                        
                                                                // $animes_geschaut = str_replace('$animes_geschaut_datenbank', $data, $animes_geschaut);
                                                                // $animes_geschaut = str_replace('$ergebnis_time', $ergebnis_time, $animes_geschaut);
                                                        }
                                                            ?>
                                                        
                                                        

                                                        Wie du siehst, ist in diesem Script schon ein Versucht enthalten, um die Daten in meine HTML-Seite zu includieren. Wenn ich dieses script jetzt mit include in meine index.php einfüge... dann passiert ... nichts. Im Browser zeigt er mir einfach nur $animes_geschaut_datenbank und $ergebnis_time an. Also warscheinlich (zumindest hoffe ich das) das gleiche Serverproblem. Die vielen IF-Anweisungen sind wiedermal ein (wie ich denke) komplizierter Weg um auf das zu kommen, was ich möchte... nämlich meine errechnete Zeit, die ich mit Anime gucken verbrachte habe. Da aber manche Datensätze in meiner Datenbank Filme sind oder manche Episoden unterschiedliche Dauern haben, musste ich diese Ausnahmen irgendwie unterkriegen, damit der mir ein genaues Ergebnis berechnet. Vielleicht nicht schön... aber selten.

                                                        man müsste ja im Prinzip auch includes in der index.php in eine Variable schreiben können und die dann abrufen können oder? Aber es funktioniert nicht. [...] $mtime = include("date.php");

                                                        Zuerst initialisierst Du eine Variable, dann includierst Du ein Script, das diese Variable mit einem anderen Wert überschreiben soll:

                                                        $mtime = time(); // now
                                                        
                                                        > 
                                                        > include 'mtime.php'; // sets $mtime e.g. $mtime = filemtime('file.php');
                                                        
                                                        

                                                        Damit erreichst Du, dass das hauptsächliche Script (hier index.php) "ungestört" weiterlaufen kann, auch wenn mtime.php die gewünschte Variable überhaupt nicht kennt und dafür eine andere definiert.

                                                        Vielen Dank, so werde ich das machen.

                                                        Hab ich wiedermal was übersehen?

                                                        Du versuchst technische Lösungen für Probleme zu finden, ohne die Natur der Probleme aus PHP-Sicht genau verstanden zu haben. Das ist für Anfänger typisch. Aus genau diesen Fehlern lernt man ja die Denkweise der Programmiersprache kennen und kann daran wachsen.

                                                        Leider bin ich nicht der Typ, der sich theoretisch alles durchlesen kann und dann sofort auf seine Aufgabenstellung übertragen kann, weswegen ich manchmal komplizierte Wege und schwierigere Wege gehe um an mein Ziel zu gelangen... diese Wege aber auch nachvollziehen kann. Die Denkweise des programmierens und des Server- und Clientseitigen ist mir dadurch auch näher gekommen.

                                                        Liebe Grüße, Simon P.

                                                        (Ja ich bin ein großer Anime-Fan (^_^), komme aber momentan nicht zum gucken, weil mich das oben beschriebene Problem wurmt und ich viel Freude an der Erstellung meiner Website habe.)

                                                        1. Lieber Simon P.,

                                                          wir bleiben bei der Grundsatzfrage: "Welche Inhalte sollen auf welcher Seite angezeigt werden?"

                                                          Die zwei möglichen Antwort-Szenarien beschränken sich auf:

                                                          1.) auf dieser einen Seite (und noch auf dieser einen anderen) (und noch...)
                                                          2.) auf allen Seiten

                                                          Im Fall von 2. ist klar, dass Du einen Platzhalter im Template einbaust, der in der index.php befüllt wird (durch Ersetzung - klar).

                                                          Im Fall von 1. braucht es eines dieser spezialisierten Zusatzscripte, die mit einer ausgeklügelten Prüfung auf eben nur die Seite(n) reagieren, für die sie angelegt wurden.

                                                          Nun zur Frage nach der Technik, wie Du welche Inhalte an welcher Stelle im Quelltext einfügen kannst.

                                                          a) Einfache Methode (Platzhalter): einfache String-Ersetzung

                                                          b) Kompliziertere Methode: String-Ersetzung mit regulären Ausdrücken (preg_replace u.ä.)

                                                          c) Objekt-orientierte Methode: DOMDocument bauen und modifizieren (mache ich gerade in meinem Projekt)

                                                          Ich denke, wie a) funktioniert, haben wir geklärt.

                                                          Wenn Du mit HTML-Kommentaren arbeitest, dann ist es vielleicht schlauer, sogenannte reguläre Ausdrücke zu benutzen. Aber noch bin ich mir nicht sicher, dass Du das im Moment tatsächlich benötigst... mal schauen.

                                                          Die Methode mit DOMDocument ist für Anfänger sehr komplex. Im Grunde wird aus dem HTML-Code ein großes Objekt gebaut, welches den Elementenbaum (DOM tree) abbildet und dabei Methoden definiert, wie ich Elemente darin finden und manipulieren kann. Zum Schluss wandelt man das DOMDocument in seine Textrepräsentation um (konvertiert zurück in HTML-Code) und gibt das Ergebnis an den Browser aus.

                                                          Ich habe in der Apache Config unter dem Punkt:
                                                          <IfModule mime_module>

                                                          folgendes hinzugefügt gehabt:
                                                          AddType application/x-httpd-php php php4 php3 html htm

                                                          Anscheinend gibt es das Problem schon öfters. Ich werde mal schauen ob ich eine Fehlerquelle finde, es kann ja nicht sein, dass ich kein Includes mehr benutzen kann -.-; .

                                                          Du willst allen Ernstes keine HTML-Dokumente vom PHP-Parser auf PHP-Code untersuchen lassen! Wie Du siehst, wird in unserem Verfahren auch keinerlei PHP-Code in den HTML-Dateien benötigt. Das Includieren von weiteren Dateien machst Du auch auf transparente Weise, indem Du eine include-Anweisung als eigenständige Anweisung notierst, und nicht innerhalb einer Wertzuweisung, einer Array-Definition oder ähnlichem.

                                                          ... Ich habe nach einer Möglichkeit gesucht, Mehrere Inhalte wegen meiner Subnavi an unterschiedlichen Stellen ein und auszuschneiden. So kam ich auf dieses konstruckt ->>

                                                          Aha. Jetzt wird es für mich konkreter. Wir reden jetzt von einer Sub-Navi. OK. Wie soll der finale HTML-Code denn mit der Subnavi aussehen? Ist das ein eigenes <nav>-Element innerhalb des <main>-Elements, oder willst Du das bestehende <nav>-Element des Templates erweitern?

                                                          Ist es vielleicht sogar sinnvoller, alle Navigationsmöglichkeiten in einer eigenen Struktur abzubilden, die anhand von $pages abgeleitet werden kann?

                                                          $line = "<!-- HEADaf"; //Die Startposition in der HTML

                                                          $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String
                                                              $head = substr($head, $anf); //Vom Anfang wird nun ausgegben
                                                          $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn
                                                              $head = substr($head, 0, $end); //Dort hört es auf, auszugeben

                                                            
                                                          Arrrgh. Das liest sich nicht schön. Ich baue einmal einen HTML-Code, den Du gemeint haben könntest:  
                                                            
                                                          ~~~html
                                                          <!-- HEADaf -->  
                                                              <ul><li><a href="?p=serien">Serien</a></li></ul>  
                                                          <!-- HEADe -->
                                                          

                                                          Wenn man jetzt den Teil mit <ul>...</ul> haben möchte, dann bietet es sich anhand der HTML-Kommentare an, das mit einem regulären Ausdruck zu machen:

                                                          $html = file_get_contents('./pages/anime.html');  
                                                            
                                                          $pattern = '~(?is)<!--[\n\r\t ]*HEADaf[\n\r\t ]*-->[\n\r\t ]*(<ul>.*?</ul>)[\n\r\t ]*<!--[\n\r\t ]*HEADe[\n\r\t ]*-->~';  
                                                            
                                                          preg_match($pattern, $html, $nav); // defines $nav = array([0] => string, [1] => string)  
                                                            
                                                          $content = preg_replace($pattern, '', $html);
                                                          

                                                          Nun (sollte: habe nichts getestet) stehen in $nav[0] der komplette Teil mit beiden HTML-Kommentaren und dem <ul>...</ul> dazwischen, in $nav[1] der Code mit <ul>...</ul> alleine und in $content der Rest, ohne den durch HTML-Kommentare markierten Teil.

                                                          if (array_key_exists("p", $_GET) // Gibt es in der Superglobalen Variable $_GET einen Schlüssel p ?
                                                              && array_key_exists($_GET["p"], $pages) // Und gibt es in dem Schlüssel eine Seite aus dem Array $pages ?
                                                          ) {
                                                              $contents = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                              $nav = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                              $head = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                          } // Wenn beides "True", lade die gewünschte Seite in die Variable $contents etc.

                                                          
                                                          >   
                                                          > ... Jetzt wird mit dem Code von oben jedes dieser Elemente "beschnitten".  
                                                            
                                                          Aha... jetzt wird mir klarer, wie Du vorgehst. Vielleicht ist da eine andere Vorgehensweise besser. Dazu müsste ich allerdings erst verstehen, was Du alles jetzt in Deinen Seiten zusammenpuzzlen willst! Mein Vorschlag beschränkte sich auf $nav und $content innerhalb des Templates. Von mehr "weiß" ich momentan noch nichts!  
                                                            
                                                          
                                                          > Das hier möchte ich in genau einer HTML Datei einfügen:  
                                                          >   
                                                          > ~~~php
                                                            
                                                          
                                                          > <?php  
                                                          >     $db = mysqli_connect("localhost", "Benutzer", "Passwort", "homepage");  
                                                          >     if(!$db){  
                                                          >     exit("Verbindungsfehler: ".mysqli_connect_error());  
                                                          >     }  
                                                          >     $db->query("SET NAMES 'utf8'");  
                                                          > ?>  
                                                          > <?php  
                                                          > if (array_key_exists('p', $_GET) && 'p' == 'animes_geschaut') {
                                                          
                                                          

                                                          Gut. Eine neue Seite, heißt 'animes_geschaut'. OK.

                                                          1.) Du sammelst die Daten in ein zuvor initialisiertes Array. Dann schließt Du die DB-Verbindung wieder. Sollte es bei der DB-Ausleserei zu Fehlern kommen, bleibt das Array halt leer.

                                                          2.) Du nimmst die Array-Daten und bastelst Dir damit (analog zu "serien") einen HTML-Code.

                                                          3.) Deine exit-Anweisung im Fehlerfall ist eine ganz schlechte Idee!

                                                          ~~~php

                                                          $ergebnisAnfang = 0;

                                                          $result = mysqli_query($db, "SELECT Name_Japanisch, ID, Name_Roomaji, Genre, Datum, Bewertung, Typ, Episoden FROM animes");
                                                              while($row = mysqli_fetch_object($result))
                                                              {
                                                                  $data .= sprintf(
                                                                  '<li><h2>' ."$row->ID. $row->Name_Roomaji". '<a href="#' ."$row->ID".'">Details</a></h2>'

                                                            
                                                          Besser, Du erstellst Deinen HTML-Code erst nachdem Du alles aus der DB ausgelesen hast. Siehe oben und "exit"... Ansonsten schaust Du in meinen Beispielcode zu "serien". Dort trenne ich auch Daten von Markup, indem ich das Markup erst nach beendigter DB-Ausleserei zusammenbaue.  
                                                            
                                                          
                                                          >         ~~~php
                                                          
                                                          if($row->Name_Roomaji == "Das Verschwinden der Haruhi Suzumiya")  
                                                          
                                                          >         {  
                                                          >             $ergebnisNeu = 161;  
                                                          >         }  
                                                          >         else if($row->Name_Roomaji == "Saishuuheiki Kanojo: Another Love Song")  
                                                          >         {
                                                          
                                                          

                                                          Du willst das switch-Statement benutzen. Damit liest sich Dein Code schöner:

                                                            
                                                                  switch ($row->Name_Roomaji) {  
                                                                      case 'Das Verschwinden der Haruhi Suzumiya':  
                                                                          $ergebnisNeu = 161; // [link:http://de.wikipedia.org/wiki/Magische_Zahl_%28Informatik%29#Magische_Zahlen_in_Code@title=magic number] - lieber anders  
                                                                      break;  
                                                                      case 'Saishuuheiki Kanojo: Another Love Song':  
                                                                          $ergebnisNeu = $row->Episoden*28;  
                                                                      break;  
                                                                      case '...':  
                                                                          $ergebnisNeu = ...;  
                                                                      break;  
                                                                      default:  
                                                                          $ergebnisNeu = 0;  
                                                                      break;  
                                                                  }
                                                          

                                                          Warum steht eigentlich Dein Ergebniswert in PHP codiert und nicht in der DB? Kannst Du Deine Anfrage nicht so gestalten, dass die Berechnung von $ergebnisNeu bereits von der DB beantwortet wird? Dort steht doch sicherlich auch die Anzahl Episoden pro Staffel bei der entsprechenden Serie dabei...?

                                                          // $ergebnis_time = printf('<p id="time">Ich habe <span>'."$ergebnis".' Stunden</span> mit Animegucken verbracht.</p>');

                                                          // $animes_geschaut = str_replace('$animes_geschaut_datenbank', $data, $animes_geschaut);
                                                                  // $animes_geschaut = str_replace('$ergebnis_time', $ergebnis_time, $animes_geschaut);
                                                          }

                                                            
                                                          Warum steht denn das <p>-Element mit der ID "time" nicht bereits in der HTML-Datei? printf spuckt sein Ergebnis sofort an den Browser. Du möchtest lieber [sprintf](http://php.net/manual/en/function.sprintf.php) benutzen. Dessen Ergebnis kann man in einer Variable speichern. Die Funktion [printf](http://php.net/manual/en/function.printf.php) dagegen gibt Dir nur einen Zahlenwert bezüglich der Länge des (an den Browser ausgegeben) Strings zurück.  
                                                            
                                                          
                                                          > Wenn ich dieses script jetzt mit include in meine index.php einfüge... dann passiert ... nichts.  
                                                            
                                                          In anderen Worten: Kein Eintrag im Fehler-Log, keine Ausgabe im HTML-Quelltext der Seite.  
                                                            
                                                          
                                                          > Im Browser zeigt er mir einfach nur $animes\_geschaut\_datenbank und $ergebnis\_time an.  
                                                            
                                                          Als sichtbare Ausgabe im Browserfenster, oder nur sichtbar im Quelltext? Du drückst Dich hier technisch betrachtet sehr vage aus...  
                                                            
                                                          
                                                          > (Ja ich bin ein großer Anime-Fan (^\_^), komme aber momentan nicht zum gucken, weil mich das oben beschriebene Problem wurmt und ich viel Freude an der Erstellung meiner Website habe.)  
                                                            
                                                          Na, dann weiterhin viel Spaß damit!  
                                                            
                                                          Liebe Grüße,  
                                                            
                                                          Felix Riesterer.
                                                          
                                                          -- 
                                                          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                          
                                                          1. Hallo Felix,

                                                            a) Einfache Methode (Platzhalter): einfache String-Ersetzung

                                                            b) Kompliziertere Methode: String-Ersetzung mit regulären Ausdrücken (preg_replace u.ä.)

                                                            c) Objekt-orientierte Methode: DOMDocument bauen und modifizieren (mache ich gerade in meinem Projekt)

                                                            Ich denke, wie a) funktioniert, haben wir geklärt.

                                                            Wenn Du mit HTML-Kommentaren arbeitest, dann ist es vielleicht schlauer, sogenannte reguläre Ausdrücke zu benutzen. Aber noch bin ich mir nicht sicher, dass Du das im Moment tatsächlich benötigst... mal schauen.

                                                            Ich bin froh, dass ich erstmal Methode a) verstanden habe. Ich werde erstmal weiter damit arbeiten (einfach, weil ich es verstanden habe). Dennoch schaue ich mir mal die regulären Ausdrücke an.

                                                            Die Methode mit DOMDocument ist für Anfänger sehr komplex. Im Grunde wird aus dem HTML-Code ein großes Objekt gebaut, welches den Elementenbaum (DOM tree) abbildet und dabei Methoden definiert, wie ich Elemente darin finden und manipulieren kann. Zum Schluss wandelt man das DOMDocument in seine Textrepräsentation um (konvertiert zurück in HTML-Code) und gibt das Ergebnis an den Browser aus.

                                                            Puh, klingt kompliziert. Für was benötigt man sowas?

                                                            Ich habe in der Apache Config unter dem Punkt: <IfModule mime_module>

                                                            folgendes hinzugefügt gehabt: AddType application/x-httpd-php php php4 php3 html htm

                                                            Anscheinend gibt es das Problem schon öfters. Ich werde mal schauen ob ich eine Fehlerquelle finde, es kann ja nicht sein, dass ich kein Includes mehr benutzen kann -.-; .

                                                            Lag nicht dadran... dazu komme ich weiter unten ->

                                                            ... Ich habe nach einer Möglichkeit gesucht, Mehrere Inhalte wegen meiner Subnavi an unterschiedlichen Stellen ein und auszuschneiden. So kam ich auf dieses konstruckt ->>

                                                            Aha. Jetzt wird es für mich konkreter. Wir reden jetzt von einer Sub-Navi. OK. Wie soll der finale HTML-Code denn mit der Subnavi aussehen? Ist das ein eigenes <nav>-Element innerhalb des <main>-Elements, oder willst Du das bestehende <nav>-Element des Templates erweitern?

                                                            Ist es vielleicht sogar sinnvoller, alle Navigationsmöglichkeiten in einer eigenen Struktur abzubilden, die anhand von $pages abgeleitet werden kann?

                                                            Naja, eigentlich rede ich davon, dass ich mehrere dynmaische Inhalte in eine HTML schreiben möchte (natürlich gehört der Inhalt zu dieser HTMl) und diese dann in das Template "puzzle". Puzzlen ist hier schon das richtige Wort für.

                                                            $line = "<!-- HEADaf"; //Die Startposition in der HTML
                                                            
                                                            > > > > $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String
                                                            > > > >     $head = substr($head, $anf); //Vom Anfang wird nun ausgegben
                                                            > > > > $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn
                                                            > > > >     $head = substr($head, 0, $end); //Dort hört es auf, auszugeben
                                                            
                                                            

                                                            Arrrgh. Das liest sich nicht schön. Ich baue einmal einen HTML-Code, den Du gemeint haben könntest:

                                                            Okay, es ließt sich nicht schön... aber ich verstehe was ich da mache.

                                                            <!-- HEADaf -->
                                                            
                                                            >     <ul><li><a href="?p=serien">Serien</a></li></ul>
                                                            > <!-- HEADe -->
                                                            
                                                            

                                                            Wenn man jetzt den Teil mit <ul>...</ul> haben möchte, dann bietet es sich anhand der HTML-Kommentare an, das mit einem regulären Ausdruck zu machen:

                                                            $html = file_get_contents('./pages/anime.html');
                                                            
                                                            > 
                                                            > $pattern = '~(?is)<!--[\n\r\t ]*HEADaf[\n\r\t ]*-->[\n\r\t ]*(<ul>.*?</ul>)[\n\r\t ]*<!--[\n\r\t ]*HEADe[\n\r\t ]*-->~';
                                                            > 
                                                            > preg_match($pattern, $html, $nav); // defines $nav = array([0] => string, [1] => string)
                                                            > 
                                                            > $content = preg_replace($pattern, '', $html);
                                                            
                                                            

                                                            Nun (sollte: habe nichts getestet) stehen in $nav[0] der komplette Teil mit beiden HTML-Kommentaren und dem <ul>...</ul> dazwischen, in $nav[1] der Code mit <ul>...</ul> alleine und in $content der Rest, ohne den durch HTML-Kommentare markierten Teil.

                                                            OK, muss ich mir nochmal in ruhe angucken. Sieht für mich so auf den ersten Blick ziemlich unübersichtlich aus.

                                                            
                                                            
                                                            > > if (array_key_exists("p", $_GET) // Gibt es in der Superglobalen Variable $_GET einen Schlüssel p ?
                                                            > >     && array_key_exists($_GET["p"], $pages) // Und gibt es in dem Schlüssel eine Seite aus dem Array $pages ?
                                                            > > ) {
                                                            > >     $contents = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                            > >     $nav = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                            > >     $head = file_get_contents('./pages/'.$pages[$_GET["p"]]);
                                                            > > }	// Wenn beides "True", lade die gewünschte Seite in die Variable $contents etc.
                                                            > > 
                                                            
                                                            

                                                            ... Jetzt wird mit dem Code von oben jedes dieser Elemente "beschnitten".

                                                            Aha... jetzt wird mir klarer, wie Du vorgehst. Vielleicht ist da eine andere Vorgehensweise besser. Dazu müsste ich allerdings erst verstehen, was Du alles jetzt in Deinen Seiten zusammenpuzzlen willst! Mein Vorschlag beschränkte sich auf $nav und $content innerhalb des Templates. Von mehr "weiß" ich momentan noch nichts!

                                                            Okay, bis jetzt puzzle ich den HEAD, die "Sub-Navi" (in meiner Index, die ich dir geschickt habe, links an der Seite die Navi) und den Text (also Kontent) zusammen. Mit head meine ich sowas, was (soweit wie ich verstanden habe), wichtig ist für jede Seite einzelnd zu bestimmen:

                                                            
                                                                <title>Meine Website / Animes / Geschaut</title>
                                                                <meta charset="UTF-8">
                                                                <meta name="description" content="Eine Liste aller Animes die ich geschaut habe.">
                                                                <meta name="author" content="Simon P.">
                                                            
                                                            

                                                            Das hier möchte ich in genau einer HTML Datei einfügen:

                                                            
                                                            
                                                            > > <?php
                                                            > >     $db = mysqli_connect("localhost", "Benutzer", "Passwort", "homepage");
                                                            > >     if(!$db){
                                                            > >     exit("Verbindungsfehler: ".mysqli_connect_error());
                                                            > >     }
                                                            > >     $db->query("SET NAMES 'utf8'");
                                                            > > ?>
                                                            > > <?php
                                                            > > if (array_key_exists('p', $_GET) && 'p' == 'animes_geschaut') {
                                                            
                                                            

                                                            Gut. Eine neue Seite, heißt 'animes_geschaut'. OK.

                                                            1.) Du sammelst die Daten in ein zuvor initialisiertes Array. Dann schließt Du die DB-Verbindung wieder. Sollte es bei der DB-Ausleserei zu Fehlern kommen, bleibt das Array halt leer.

                                                            2.) Du nimmst die Array-Daten und bastelst Dir damit (analog zu "serien") einen HTML-Code.

                                                            Immernoch die gleiche Seite (also nicht analog zu "serien"), nur den Namen verändert.

                                                            3.) Deine exit-Anweisung im Fehlerfall ist eine ganz schlechte Idee!

                                                            Habe ich geändert in:

                                                            
                                                            <?php
                                                                 $db = mysqli_connect("localhost", "Benutzer", "Passwort", "homepage");
                                                                 if(!$db){
                                                                 exit("Verbindungsfehler: Es konnte keine Verbindung zur Datenbank aufgenommen werden.");
                                                                 }
                                                                 $db->query("SET NAMES 'utf8'");
                                                            ?>
                                                            
                                                            

                                                            Besser, Du erstellst Deinen HTML-Code erst nachdem Du alles aus der DB ausgelesen hast. Siehe oben und "exit"... Ansonsten schaust Du in meinen Beispielcode zu "serien". Dort trenne ich auch Daten von Markup, indem ich das Markup erst nach beendigter DB-Ausleserei zusammenbaue.

                                                            Hm, habe ich bisher noch nicht gemacht, weil es einfach nicht funktioniert hat (habe es noch nicht richtig getestet und dran rumgebastelt, weswegen ich dir jetzt keinen Fehlercode oder meinen Code etc. geben kann). Ich werde das danach in Angriff nehmen, jetzt erstmal bin ich froh, dass ich mit der alten Variante (also gleich alles formatieren und nicht erst die Daten in ein Array schreiben) zurecht komme und es funktioniert.

                                                            if($row->Name_Roomaji == "Das Verschwinden der Haruhi Suzumiya")
                                                            
                                                            > >         {
                                                            > >             $ergebnisNeu = 161;
                                                            > >         }
                                                            > >         else if($row->Name_Roomaji == "Saishuuheiki Kanojo: Another Love Song")
                                                            > >         {
                                                            
                                                            

                                                            Du willst das switch-Statement benutzen. Damit liest sich Dein Code schöner:

                                                            Sehr gute Idee, von soetwas habe ich schonmal in Java gehört, gibt es also hier auch (^_-).

                                                            
                                                            
                                                            >         switch ($row->Name_Roomaji) {
                                                            >             case 'Das Verschwinden der Haruhi Suzumiya':
                                                            >                 $ergebnisNeu = 161; // [magic number](http://de.wikipedia.org/wiki/Magische_Zahl_%28Informatik%29#Magische_Zahlen_in_Code) - lieber anders
                                                            >             break;
                                                            >             case 'Saishuuheiki Kanojo: Another Love Song':
                                                            >                 $ergebnisNeu = $row->Episoden*28;
                                                            >             break;
                                                            >             case '...':
                                                            >                 $ergebnisNeu = ...;
                                                            >             break;
                                                            >             default:
                                                            >                 $ergebnisNeu = 0;
                                                            >             break;
                                                            >         }
                                                            
                                                            

                                                            Warum steht eigentlich Dein Ergebniswert in PHP codiert und nicht in der DB? Kannst Du Deine Anfrage nicht so gestalten, dass die Berechnung von $ergebnisNeu bereits von der DB beantwortet wird? Dort steht doch sicherlich auch die Anzahl Episoden pro Staffel bei der entsprechenden Serie dabei...?

                                                            Guter Einwand, sofort geändert.

                                                            
                                                            
                                                            > >        // $ergebnis_time = printf('<p id="time">Ich habe <span>'."$ergebnis".' Stunden</span> mit Animegucken verbracht.</p>');
                                                            > > 
                                                            > >         // $animes_geschaut = str_replace('$animes_geschaut_datenbank', $data, $animes_geschaut);
                                                            > >         // $animes_geschaut = str_replace('$ergebnis_time', $ergebnis_time, $animes_geschaut);
                                                            > > }
                                                            
                                                            

                                                            Warum steht denn das <p>-Element mit der ID "time" nicht bereits in der HTML-Datei? printf spuckt sein Ergebnis sofort an den Browser. Du möchtest lieber sprintf benutzen. Dessen Ergebnis kann man in einer Variable speichern. Die Funktion printf dagegen gibt Dir nur einen Zahlenwert bezüglich der Länge des (an den Browser ausgegeben) Strings zurück.

                                                            Okay, dass hat mir zur Lösung verholfen, danke dir.

                                                            Wenn ich dieses script jetzt mit include in meine index.php einfüge... dann passiert ... nichts.

                                                            In anderen Worten: Kein Eintrag im Fehler-Log, keine Ausgabe im HTML-Quelltext der Seite.

                                                            Im Browser zeigt er mir einfach nur $animes_geschaut_datenbank und $ergebnis_time an.

                                                            Als sichtbare Ausgabe im Browserfenster, oder nur sichtbar im Quelltext? Du drückst Dich hier technisch betrachtet sehr vage aus...

                                                            Okay, es wurde im Quelltext nur $database und $ergebnis_time angezeigt und im Browser auf der Seite auch. Schlussendlich habe ich dann doch den Fehler gefunden... Irgendwas stimmt mit dieser Schleife nicht:

                                                            
                                                            if (array_key_exists('p', $_GET) && 'p' == 'animes_geschaut')
                                                            
                                                            

                                                            Habe ich diese Schleife einfach weggelassen und dadrunter einfach das eingefügt

                                                            
                                                            $ergebnis_time = sprintf("$ergebnis");
                                                                    $tmp = str_replace('$database', $data, $tmp);
                                                                    $tmp = str_replace('$ergebnis_time', $ergebnis, $tmp);
                                                            
                                                            

                                                            Dann zeigt er alles so an wie ich es will. Perfekt, es funktioniert. Auf anderen Seiten wird auch nichts angezeigt, weil (wie ich vermute) ja die Variable $database und $ergebnis_time nicht vorhanden ist. Würde ich jetzt auf einer anderen Seite diese Variablen benutzen, dann ist klar, dass er es ersetzen würde. Also gab es kein Problem an meinem Server oder sonstiges... es war einfach nur die Schleife. Übrigends: Ich wäre nicht auf die Schleife gekommen, wenn mir nicht der Freund meiner Schwester, der Informatik studiert, den Tipp gegeben hätte (^-^).

                                                            Liebe Grüße,

                                                            Simon P.

                                                            1. Lieber Simon P.,

                                                              Ist es vielleicht sogar sinnvoller, alle Navigationsmöglichkeiten in einer eigenen Struktur abzubilden, die anhand von $pages abgeleitet werden kann?

                                                              Naja, eigentlich rede ich davon, dass ich mehrere dynmaische Inhalte in eine HTML schreiben möchte (natürlich gehört der Inhalt zu dieser HTMl) und diese dann in das Template "puzzle". Puzzlen ist hier schon das richtige Wort für.

                                                              dann sollte man sich genauer überlegen, wie man diese Puzzlelei einfacher gestalten kann. Bitte definiere doch einfach und klar die einzelnen Teile! Offensichtlich benötigst Du das <title> Element aus dem <head>-Bereich ebenso, wie die Subnavi. Aber was noch und wie ist es in einer HTML-Datei abgelegt?

                                                              Okay, bis jetzt puzzle ich den HEAD, die "Sub-Navi" (in meiner Index, die ich dir geschickt habe, links an der Seite die Navi) und den Text (also Kontent) zusammen. Mit head meine ich sowas, was (soweit wie ich verstanden habe), wichtig ist für jede Seite einzelnd zu bestimmen:

                                                              <title>Meine Website / Animes / Geschaut</title>
                                                                  <meta charset="UTF-8">
                                                                  <meta name="description" content="Eine Liste aller Animes die ich geschaut habe.">
                                                                  <meta name="author" content="Simon P.">

                                                                
                                                              Das wird dann tatsächlich eine Aufgabe für einen HTML-Parser (Methode c). Man kann es auch mit der Methode b) machen, aber sicherer ist es mit einem Parser. Das schauen wir uns demnächst an.  
                                                                
                                                              
                                                              > > 3.) Deine exit-Anweisung im Fehlerfall ist eine ganz schlechte Idee!  
                                                              >   
                                                              > Habe ich geändert in:  
                                                              > ~~~php
                                                              
                                                              <?php  
                                                              
                                                              >      $db = mysqli_connect("localhost", "Benutzer", "Passwort", "homepage");  
                                                              >      if(!$db){  
                                                              >      exit("Verbindungsfehler: Es konnte keine Verbindung zur Datenbank aufgenommen werden.");  
                                                              >      }  
                                                              >      $db->query("SET NAMES 'utf8'");  
                                                              > ?>
                                                              
                                                              

                                                              Ach, und da steht jetzt kein exit-Statement mehr? Ein Programmabbruch ist eine sehr schlechte Idee!

                                                              Dieses exit bewirkt, dass _kein_ korrekt zusammengesetztes HTML-Dokument an den Browser gesandt wird. Probiere es doch einmal aus, indem Du die Login-Daten absichtlich verfälschst! Was Du in einem solchen Fall willst, ist eine Seite, die ebenso ein vollständiges HTML-Dokument ist, wie alle anderen auch. Nicht nur eine (egal wie aussagekräftige) Fehlermeldung in einer simplen Text-Datei. Was soll denn der Seitenbesucher machen, wenn ein Fehler auftritt? Kann er den Fehler beheben oder vermeiden? Nein, kann er nicht, aber vielleicht kann er aus der Navi einen anderen Link auswählen... halt, kann er nicht, da ist ja gerade keine Navi.

                                                              Verstanden?

                                                              Besser, Du erstellst Deinen HTML-Code erst nachdem Du alles aus der DB ausgelesen hast. [...]
                                                              Hm, habe ich bisher noch nicht gemacht, weil es einfach nicht funktioniert hat (habe es noch nicht richtig getestet und dran rumgebastelt, weswegen ich dir jetzt keinen Fehlercode oder meinen Code etc. geben kann).

                                                              Es fällt leichter, Fehler beim DB-Zugriff im Vorfeld abzufangen. Beispiel:

                                                              $data = array();  
                                                                
                                                              if ($db) {  
                                                                  // read DB into $data array  
                                                              }  
                                                                
                                                              // default (in case of error)  
                                                              $html = '<p class="error">Sorry, no data available.</p>';  
                                                                
                                                              if (!empty($data)) {  
                                                                
                                                                  $html = '<dl>';  
                                                                
                                                                  foreach ($data.....) {}  
                                                              }
                                                              

                                                              Wenn der Zugriff auf die DB aus welchen Gründen auch immer nicht geklappt hat, enthält $data keine Daten. Dafür landet auf der Seite genau der Hinweis, der für den Besucher relevant ist. Der Hinweis wird korrekt in den Platzhalter eingefügt und steht an genau der Stelle, an die er soll.

                                                              Irgendwas stimmt mit dieser Schleife nicht:

                                                              if (array_key_exists('p', $_GET) && 'p' == 'animes_geschaut')

                                                                
                                                              Das ist keine Schleife, das ist eine Verzweigung. ;-)  
                                                                
                                                              Du willst also prüfen, ob der String-Wert "p" ungefähr das gleiche ergibt wie "animes\_geschaut". Das ist aber nicht das gleiche, auch nicht ungefähr.  
                                                                
                                                              Tipp: In PHP gibt es zwei verschiedene "ist das gleiche wie"-[Operatoren](http://php.net/manual/de/language.operators.comparison.php). Entweder "==" (ungefähr gleich) oder "===" (exakt gleich). Schau mal nach, was da wie genau funktioniert. Das kann in manchen Fällen sehr zur Verwirrung führen.  
                                                                
                                                              Liebe Grüße,  
                                                                
                                                              Felix Riesterer.
                                                              
                                                              -- 
                                                              "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                              
                                                              1. Hallo Felix,

                                                                dann sollte man sich genauer überlegen, wie man diese Puzzlelei einfacher gestalten kann. Bitte definiere doch einfach und klar die einzelnen Teile! Offensichtlich benötigst Du das <title> Element aus dem <head>-Bereich ebenso, wie die Subnavi. Aber was noch und wie ist es in einer HTML-Datei abgelegt?

                                                                Bis jetzt gibt es nur die 3 großen Teile die zusammengepuzzlet werden. Dazu kommen dann die Neuigkeiten, die einfach auf jede Seite kommen und die file_mtime, die auf manchen Seiten hinzugfügt wird.
                                                                Zu file_mtime kurz:
                                                                Ich habe es so gelöst, dass ich einfach auf in alle HTML-Seiten die Variable $mtime eingefügt habe wo ich wollte (nicht ins Template).
                                                                In die index.php habe ich dann das in die str_replace geschrieben:

                                                                  
                                                                $tmp = str_replace(  
                                                                    array('$contents', '$news', '$nav', '$head', '$mtime'),  
                                                                    array($contents, $news, $nav, $head, date('d.m.Y, H:i:s', filemtime('./pages/'.$pages[$_GET['p']]))),  
                                                                    $tmp  
                                                                );  
                                                                
                                                                

                                                                Bei diesem System ist mir aufgefallen, dass wenn ich zum ersten mal die Seite aufrufe, und damit noch nichts in meinem Schlüssel "p" drinne stehen habe, dass ich dann noch eine else Bedingung benötige, damit der mir keinen Fehler ausspuckt. Das sieht dann so aus:

                                                                  
                                                                if (array_key_exists("p", $_GET) // Gibt es in der Superglobalen Variable $_GET einen Schlüssel p ?  
                                                                    && array_key_exists($_GET["p"], $pages) // Und gibt es in dem Schlüssel eine Seite aus dem Array $pages ?  
                                                                ) {  
                                                                    $contents = file_get_contents('./pages/'.$pages[$_GET["p"]]);  
                                                                    $nav = file_get_contents('./pages/'.$pages[$_GET["p"]]);  
                                                                    $head = file_get_contents('./pages/'.$pages[$_GET["p"]]);  
                                                                }	// Wenn beides "True", lade die gewünschte Seite in die Variable $contents etc.  
                                                                else  
                                                                {  
                                                                    $_GET = array("p" => "home");  
                                                                }  
                                                                
                                                                

                                                                Okay, bis jetzt puzzle ich den HEAD, die "Sub-Navi" (in meiner Index, die ich dir geschickt habe, links an der Seite die Navi) und den Text (also Kontent) zusammen. Mit head meine ich sowas, was (soweit wie ich verstanden habe), wichtig ist für jede Seite einzelnd zu bestimmen:

                                                                <title>Meine Website / Animes / Geschaut</title>
                                                                    <meta charset="UTF-8">
                                                                    <meta name="description" content="Eine Liste aller Animes die ich geschaut habe.">
                                                                    <meta name="author" content="Simon P.">

                                                                
                                                                >   
                                                                > Das wird dann tatsächlich eine Aufgabe für einen HTML-Parser (Methode c). Man kann es auch mit der Methode b) machen, aber sicherer ist es mit einem Parser. Das schauen wir uns demnächst an.  
                                                                  
                                                                Bis jetzt ist mir natürlich nicht klar weswegen (ich kenne Methode C und ihre Vorteile noch nicht). Das einzige was ich mich frage ist, warum ich nicht weiterhin meine Methode benutzen kann, die ja funktioniert und wirklich nur 1 zu 1 das von meinen HTML Seiten ins Template übertragt, was ich möchte. Damit weiß ich 1. wie es funktioniert und 2. ist es (meiner Ansicht nach) sehr übersichtlich. Aber ich bin gespannt, was Methode C mit sich bringt.  
                                                                  
                                                                
                                                                > > > 3.) Deine exit-Anweisung im Fehlerfall ist eine ganz schlechte Idee!  
                                                                > >   
                                                                > > Habe ich geändert in:  
                                                                > > ~~~php
                                                                
                                                                <?php  
                                                                
                                                                > >      $db = mysqli_connect("localhost", "Benutzer", "Passwort", "homepage");  
                                                                > >      if(!$db){  
                                                                > >      exit("Verbindungsfehler: Es konnte keine Verbindung zur Datenbank aufgenommen werden.");  
                                                                > >      }  
                                                                > >      $db->query("SET NAMES 'utf8'");  
                                                                > > ?>
                                                                
                                                                

                                                                Ach, und da steht jetzt kein exit-Statement mehr? Ein Programmabbruch ist eine sehr schlechte Idee!

                                                                Dieses exit bewirkt, dass _kein_ korrekt zusammengesetztes HTML-Dokument an den Browser gesandt wird. Probiere es doch einmal aus, indem Du die Login-Daten absichtlich verfälschst! Was Du in einem solchen Fall willst, ist eine Seite, die ebenso ein vollständiges HTML-Dokument ist, wie alle anderen auch. Nicht nur eine (egal wie aussagekräftige) Fehlermeldung in einer simplen Text-Datei. Was soll denn der Seitenbesucher machen, wenn ein Fehler auftritt? Kann er den Fehler beheben oder vermeiden? Nein, kann er nicht, aber vielleicht kann er aus der Navi einen anderen Link auswählen... halt, kann er nicht, da ist ja gerade keine Navi.

                                                                Verstanden?

                                                                Ja, hab es jetzt mal ausprobiert, was passiert, wenn es einen Fehler mit dem Login gibt... meine Seite wird komplett nicht mehr angezeigt. Nun gut, werde ich mal versuchen, das zu beheben.

                                                                Besser, Du erstellst Deinen HTML-Code erst nachdem Du alles aus der DB ausgelesen hast. [...]
                                                                Hm, habe ich bisher noch nicht gemacht, weil es einfach nicht funktioniert hat (habe es noch nicht richtig getestet und dran rumgebastelt, weswegen ich dir jetzt keinen Fehlercode oder meinen Code etc. geben kann).

                                                                Es fällt leichter, Fehler beim DB-Zugriff im Vorfeld abzufangen. Beispiel:

                                                                $data = array();

                                                                if ($db) {
                                                                    // read DB into $data array
                                                                }

                                                                // default (in case of error)
                                                                $html = '<p class="error">Sorry, no data available.</p>';

                                                                if (!empty($data)) {

                                                                $html = '<dl>';

                                                                foreach ($data.....) {}
                                                                }

                                                                
                                                                >   
                                                                > Wenn der Zugriff auf die DB aus welchen Gründen auch immer nicht geklappt hat, enthält $data keine Daten. Dafür landet auf der Seite genau der Hinweis, der für den Besucher relevant ist. Der Hinweis wird korrekt in den Platzhalter eingefügt und steht an genau der Stelle, an die er soll.  
                                                                  
                                                                Muss ich mal rumprobieren. Bis jetzt verstehe ich nicht so richtig, was genau die IF-Anweisung prüft, was dann in der IF-Verzweigung stehen soll... und was die foreach macht.  
                                                                  
                                                                
                                                                > > Irgendwas stimmt mit dieser Schleife nicht:  
                                                                > >   
                                                                > > ~~~php
                                                                  
                                                                
                                                                > > if (array_key_exists('p', $_GET) && 'p' == 'animes_geschaut')  
                                                                > > 
                                                                
                                                                

                                                                Das ist keine Schleife, das ist eine Verzweigung. ;-)

                                                                Stimmt.

                                                                Du willst also prüfen, ob der String-Wert "p" ungefähr das gleiche ergibt wie "animes_geschaut". Das ist aber nicht das gleiche, auch nicht ungefähr.

                                                                Hm, ich habe die Verzweigung von dir "abgeschrieben". Die hattest du in deinem Post vom 28.07. um 01:18 Uhr mir als Vorschlag genannt. Nun bin ich mir nicht sicher, ob ich das da falsch verstanden habe oder nicht.

                                                                Tipp: In PHP gibt es zwei verschiedene "ist das gleiche wie"-Operatoren. Entweder "==" (ungefähr gleich) oder "===" (exakt gleich). Schau mal nach, was da wie genau funktioniert. Das kann in manchen Fällen sehr zur Verwirrung führen.

                                                                Okay, mache ich.

                                                                Liebe Grüße,

                                                                Simon P.

                                                                1. Hallo Felix,

                                                                  Ja, hab es jetzt mal ausprobiert, was passiert, wenn es einen Fehler mit dem Login gibt... meine Seite wird komplett nicht mehr angezeigt. Nun gut, werde ich mal versuchen, das zu beheben.

                                                                  Besser, Du erstellst Deinen HTML-Code erst nachdem Du alles aus der DB ausgelesen hast. [...]
                                                                  Hm, habe ich bisher noch nicht gemacht, weil es einfach nicht funktioniert hat (habe es noch nicht richtig getestet und dran rumgebastelt, weswegen ich dir jetzt keinen Fehlercode oder meinen Code etc. geben kann).

                                                                  Es fällt leichter, Fehler beim DB-Zugriff im Vorfeld abzufangen. Beispiel:

                                                                  $data = array();

                                                                  if ($db) {
                                                                      // read DB into $data array
                                                                  }

                                                                  // default (in case of error)
                                                                  $html = '<p class="error">Sorry, no data available.</p>';

                                                                  if (!empty($data)) {

                                                                  $html = '<dl>';

                                                                  foreach ($data.....) {}
                                                                  }

                                                                  
                                                                  > >   
                                                                  > > Wenn der Zugriff auf die DB aus welchen Gründen auch immer nicht geklappt hat, enthält $data keine Daten. Dafür landet auf der Seite genau der Hinweis, der für den Besucher relevant ist. Der Hinweis wird korrekt in den Platzhalter eingefügt und steht an genau der Stelle, an die er soll.  
                                                                  >   
                                                                  > Muss ich mal rumprobieren. Bis jetzt verstehe ich nicht so richtig, was genau die IF-Anweisung prüft, was dann in der IF-Verzweigung stehen soll... und was die foreach macht.  
                                                                    
                                                                  Hatte die letzten Tage nicht so viel Zeit. Habe es jetzt aber so hinbekommen mit deinem Vorschlag, den du oben beschrieben hast. Ich wusste nicht ganz was du meintest, weil ich meine Datenbank zu dem Zeitpunkt noch nicht mit einem Array und den regulären Ausdrücken gelöst hatte, was ich jetzt aber habe. So funktioniert bei mir alles super. Auch wenn z.B. das Passwort nicht stimmt, wir nur meine Website angezeigt. Den Fehler der oben dann über der Website erschienen ist, habe ich mit einem @ vor dem mysql\_connect gelöst. So passiert nichts wenn die Datenbankabfrage nicht funktioniert, außer das eine Fehlermeldung an der Stelle erscheint, wo die Datenbank sonst ist. Super, vielen Dank  
                                                                    
                                                                  Vielen Dank,  
                                                                    
                                                                  Schöne Grüße,  
                                                                  Simon P.
                                                                  
                                                                  1. Lieber Simon P.,

                                                                    es freut mich, dass Du voran kommst. Vielleicht magst Du mal einen Link zu Deiner Seite posten, damit man das Werk begutachten kann...?

                                                                    Liebe Grüße,

                                                                    Felix Riesterer.

                                                                    --
                                                                    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                                    1. Hallo Felix,

                                                                      Bisher habe ich noch keinen Server und daher meine Seite noch nicht online. Ich möchte erst meine Website im groben fertig stellen, bevor ich diese online stelle. Im moment habe ich wenig Zeit, weswegen ich kaum voranschreite. Außerdem muss ich mich noch um ein paar rechtliche Sachen schlau machen, nicht dass es wegen der Website Ärger gibt.

                                                                      Liebe Grüße
                                                                      Simon P.

                                                                      1. Hallo Felix,

                                                                        meine Website ist online. An Inhalten fehlt es noch ein bisschen, aber aus Testgründen habe ich sie schon online gestellt.

                                                                        Grüße,
                                                                        Simon P.

                                                                        1. Lieber Simon P.,

                                                                          meine Website ist online.

                                                                          Glückwunsch! Mal den Validator drüberlaufen lassen... oh, 11 Fehler und 4 Warnungen. Warum? Nun, Du verwendest Schreibweisen von HTML5 und deklarierst den HTML-Code aber mit einem "HTML 4.01 Transitional"-Doctype. Wenn Du das zu einem HTML5-Doctype änderst, gehen einige dieser Fehler und Warnungen weg.

                                                                          An Inhalten fehlt es noch ein bisschen, aber aus Testgründen habe ich sie schon online gestellt.

                                                                          Eine Website ist nie fertig. Von daher braucht es keine Entschuldigung.

                                                                          Schauen wir einmal in den Aufbau und seine Semantik - unter der Annahme, dass das HTML5 sein soll:

                                                                          <!DOCTYPE html>  
                                                                          <html>  
                                                                              <head>  
                                                                                  <title>Simons no Japan</title>  
                                                                                  <meta charset="UTF-8">  
                                                                          [...]  
                                                                              </head>  
                                                                              <body>  
                                                                                  <header>  
                                                                                      [...]  
                                                                                  </header>  
                                                                                  <nav id="steuerungoben">  
                                                                                      <ul>  
                                                                                          [...]  
                                                                                      </ul>  
                                                                                  </nav>  
                                                                                  <div id="wrapper">  
                                                                                      <nav id="steuerunglinks">  
                                                                                          <ul>  
                                                                                              [...]  
                                                                                         </ul>  
                                                                            
                                                                                      </nav>  
                                                                                      <aside id="neuigkeiten">  
                                                                                          <h2>Neuigkeiten bei:</h2>  
                                                                                          <ul>  
                                                                                              [...]  
                                                                                          </ul>  
                                                                                          <h2>Blogs</h2>  
                                                                                          <ul>  
                                                                                              [...]  
                                                                                          </ul>  
                                                                                      </aside>  
                                                                                      <section>  
                                                                                          [...]  
                                                                                      </section>  
                                                                                  </div>  
                                                                                  <footer>  
                                                                                      [...]  
                                                                                  </footer>  
                                                                              </body>  
                                                                          </html>
                                                                          

                                                                          Du benutzt da <div id="wrapper">. Meiner Ansicht nach wäre hier besser ein <main>-Element. Außerdem fällt auf, dass Deine Seite zwar Unterüberschriften (<h2>), aber keine Hauptüberschrift (<h1>) enthält. Warum ist das so? Speziell in HTML5 ist es gedacht, ein <section>-Element mit <h1> zu beginnen, sodass bei verschachtelten <section>-Elementen die <h1>-Elemente wie Unterüberschriften verstanden werden - ungeachtet der möglichen weiteren hx-Elemente.

                                                                          Aus meiner Sicht sind HTML-Kommentare in der fertigen Seite eher störend, es sei denn, es stehen für verarbeitende Programme Hinweise drin, die der Seitenbesucher so nicht angezeigt bekommt. Auch füge ich bei meinen Projekten gerne noch einen HTML-Kommentar in den <head>-Bereich ein, in dem steht, wann dieses HTML-Dokument von welcher URL aus abgerufen wurde. Aber alle anderen HTML-Kommentare sollten meiner Meinung nach entfernt werden.

                                                                          Liebe Grüße,

                                                                          Felix Riesterer.

                                                                          --
                                                                          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                                          1. Hallo Felix,

                                                                            Glückwunsch! Mal den Validator drüberlaufen lassen... oh, 11 Fehler und 4 Warnungen. Warum? Nun, Du verwendest Schreibweisen von HTML5 und deklarierst den HTML-Code aber mit einem "HTML 4.01 Transitional"-Doctype. Wenn Du das zu einem HTML5-Doctype änderst, gehen einige dieser Fehler und Warnungen weg.

                                                                            Ich habe es jetzt in <!DOCTYPE HTML> geändert, da ich nicht wusste, wie ich es in HTML ändern sollte. Jetzt zeigt er mir auch keine Fehler mehr an. Als ich bei dem, was ich vorher drin stehen hatte "HTML public ..." nur die 4.01 zu einer 5 geändert hatte gab es trotzdem ne Menge Fehler.
                                                                            Ist dieser "Public ..." DOCTYPE wichtig?

                                                                            An Inhalten fehlt es noch ein bisschen, aber aus Testgründen habe ich sie schon online gestellt.

                                                                            Eine Website ist nie fertig. Von daher braucht es keine Entschuldigung.

                                                                            Schauen wir einmal in den Aufbau und seine Semantik - unter der Annahme, dass das HTML5 sein soll:

                                                                            <!DOCTYPE html>

                                                                            <html>
                                                                                <head>
                                                                                    <title>Simons no Japan</title>
                                                                                    <meta charset="UTF-8">
                                                                            [...]
                                                                                </head>
                                                                                <body>
                                                                                    <header>
                                                                                        [...]
                                                                                    </header>
                                                                                    <nav id="steuerungoben">
                                                                                        <ul>
                                                                                            [...]
                                                                                        </ul>
                                                                                    </nav>
                                                                                    <div id="wrapper">
                                                                                        <nav id="steuerunglinks">
                                                                                            <ul>
                                                                                                [...]
                                                                                           </ul>

                                                                            </nav>
                                                                                        <aside id="neuigkeiten">
                                                                                            <h2>Neuigkeiten bei:</h2>
                                                                                            <ul>
                                                                                                [...]
                                                                                            </ul>
                                                                                            <h2>Blogs</h2>
                                                                                            <ul>
                                                                                                [...]
                                                                                            </ul>
                                                                                        </aside>
                                                                                        <section>
                                                                                            [...]
                                                                                        </section>
                                                                                    </div>
                                                                                    <footer>
                                                                                        [...]
                                                                                    </footer>
                                                                                </body>
                                                                            </html>

                                                                            
                                                                            >   
                                                                            > Du benutzt da `<div id="wrapper">`{:.language-html}. Meiner Ansicht nach wäre hier besser ein <main>-Element. Außerdem fällt auf, dass Deine Seite zwar Unterüberschriften (<h2>), aber keine Hauptüberschrift (<h1>) enthält. Warum ist das so? Speziell in HTML5 ist es gedacht, ein <section>-Element mit <h1> zu beginnen, sodass bei verschachtelten <section>-Elementen die <h1>-Elemente wie Unterüberschriften verstanden werden - ungeachtet der möglichen weiteren hx-Elemente.  
                                                                            >  
                                                                            
                                                                            Habe ich erst nicht gemacht, weil sublime bei mir das <main> Element in einer CSS nicht erkannt hat. Dann habe ich irgendwo gelesen das man es noch mit "display: block;" deklarieren muss. Habe es gemacht und funktioniert nun. Dennoch erkennt sublime das Element in einer CSS nicht an (es ist weiß und nicht rot). Überschriften habe ich soweit alle geändert. Bei Neuigkeiten und Blogs habe ich nur h2 genommen, weil ich ja nur eine h1 pro Seite benutzen darf (habe ich mal so gelesen).  
                                                                              
                                                                            
                                                                            > Aus meiner Sicht sind HTML-Kommentare in der fertigen Seite eher störend, es sei denn, es stehen für verarbeitende Programme Hinweise drin, die der Seitenbesucher so nicht angezeigt bekommt. Auch füge ich bei meinen Projekten gerne noch einen HTML-Kommentar in den <head>-Bereich ein, in dem steht, wann dieses HTML-Dokument von welcher URL aus abgerufen wurde. Aber alle anderen HTML-Kommentare sollten meiner Meinung nach entfernt werden.  
                                                                              
                                                                            Musste ich mit dem Kommentaren so machen wegen dem hier:  
                                                                            ~~~php
                                                                              
                                                                            $line = "<!-- HEADaf"; //Die Startposition in der HTML  
                                                                            $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String  
                                                                                $head = substr($head, $anf); //Vom Anfang wird nun ausgegben  
                                                                            $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn  
                                                                                $head = substr($head, 0, $end); //Dort hört es auf, auszugeben  
                                                                              
                                                                            $line2 = "<!-- NAVaf";  
                                                                            $anf2 = strpos($nav, $line2);  
                                                                                $nav = substr($nav, $anf2);  
                                                                            $end2 = strpos($nav, "<!-- NAVe -->");  
                                                                                $nav = substr($nav, 0, $end2);  
                                                                              
                                                                            $line3 = "<!-- MAINaf";  
                                                                            $anf3 = strpos($contents, $line3);  
                                                                                $contents = substr($contents, $anf3);  
                                                                            $end3 = strpos($contents, "<!-- MAINe -->");  
                                                                                $contents = substr($contents, 0, $end3);  
                                                                            
                                                                            

                                                                            Liebe Grüße,

                                                                            Simon P.

                                                                            1. Lieber Simon P.,

                                                                              Ich habe es jetzt in <!DOCTYPE HTML> geändert, da ich nicht wusste, wie ich es in HTML ändern sollte. Jetzt zeigt er mir auch keine Fehler mehr an.

                                                                              super. Alles OK.

                                                                              Als ich bei dem, was ich vorher drin stehen hatte "HTML public ..." nur die 4.01 zu einer 5 geändert hatte gab es trotzdem ne Menge Fehler.
                                                                              Ist dieser "Public ..." DOCTYPE wichtig?

                                                                              Der korrekte Doctype ist wichtig, damit das Markup (lies: Dein HTML-Code) nach den dafür passenden Regeln "verstanden" wird. [Doctypes im Wiki]

                                                                              weil sublime bei mir das <main> Element in einer CSS nicht erkannt hat.

                                                                              Da ich nicht mit Sublime arbeite, verstehe ich den Sinn hinter dieser Aussage nicht. Nicht irgendein Texteditor muss im CSS-Kontext ein Element namens "main" "verstehen", sondern der Browser. Ob der das tut, kann man bei caniuse.com nachschauen: [caniuse zu <main>]

                                                                              Aus meiner Sicht sind HTML-Kommentare in der fertigen Seite eher störend, [...]
                                                                              Musste ich mit dem Kommentaren so machen wegen dem hier:

                                                                              $line = "<!-- HEADaf"; //Die Startposition in der HTML
                                                                              $anf = strpos($head, $line); //Anfangsposition in dem jeweiligen String
                                                                                  $head = substr($head, $anf); //Vom Anfang wird nun ausgegben
                                                                              $end = strpos($head, "<!-- HEADe -->"); //Endposition wird angegebn
                                                                                  $head = substr($head, 0, $end); //Dort hört es auf, auszugeben

                                                                              $line2 = "<!-- NAVaf";
                                                                              $anf2 = strpos($nav, $line2);
                                                                                  $nav = substr($nav, $anf2);
                                                                              $end2 = strpos($nav, "<!-- NAVe -->");
                                                                                  $nav = substr($nav, 0, $end2);

                                                                              $line3 = "<!-- MAINaf";
                                                                              $anf3 = strpos($contents, $line3);
                                                                                  $contents = substr($contents, $anf3);
                                                                              $end3 = strpos($contents, "<!-- MAINe -->");
                                                                                  $contents = substr($contents, 0, $end3);

                                                                                
                                                                              Hmm. Irgendwann wirst Du Deinen HTML-Code vielleicht [mit anderen Mitteln zusammensetzen](http://de.php.net/manual/de/domdocument.loadhtml.php), sodass Du vielleicht keine Kommentare mehr benötigst. Aber bis dahin wist Du erst noch eine Menge anderer Dinge lernen und üben.  
                                                                                
                                                                              Liebe Grüße,  
                                                                                
                                                                              Felix Riesterer.
                                                                              
                                                                              -- 
                                                                              "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                                              
                                                                              1. Hallo Felix,

                                                                                ... Aber bis dahin wist Du erst noch eine Menge anderer Dinge lernen und üben.

                                                                                Das stimmt wohl und ich habe gleich eine Sache, die mir schon von Anfang an Kopfzerbrechen bereitet.
                                                                                Kurz zum Verständnis: Ich möchte eine einfache Suche erstellen. Der Benutzer soll in ein Formular ein Wort eingeben. Dann soll per $_GET Methode ein PHP-Script, je nachdem was für ein Wort er eingegeben hat, eine Liste mit Möglichen Treffern ausgespuckt werden. Diese Liste enthällt Verweise auf HTML Seiten. Allgemein habe ich schon mit der Verwirklichung einige Probleme, aber ich möchte noch selber ein wenig dran herum basteln.
                                                                                Nun die Frage die mich aufhällt.
                                                                                Wie du weißt benutze ich ein Template-System. Wenn nun jemand die HTML-Seite mit der Suche aufruft, sieht die URL so aus: ...index.php?p=seite1 . Nun möchte ich, dass der Benutzer etwas eingeben kann und sich die URL zu so etwas verändert: index.php?p=seite1&s=suchtag . Das Ergebnis soll sein, dass die Seite immernoch die gleiche bleibt und sich nur der Inhalt ändert. ich dachte mir, ich mache das über ein weiteres Template-System. Nun aber das Problem, dass er bei dieser Schleife...

                                                                                  
                                                                                if (array_key_exists("s", $_GET)  
                                                                                    && array_key_exists($_GET["s"], $pages)  
                                                                                ) {  
                                                                                
                                                                                

                                                                                ... den Array-key nicht erkennt, wenn er nach dem kaufmännischen "Undzeichen" (&) steht. Also er erkennt den Array-Key nicht in dieser URL: index.php?p=seit1&s=suchtag

                                                                                Warum? Hast du eine Idee?

                                                                                Grüße,

                                                                                Simon P.

                                                                                1. Lieber Simon P.,

                                                                                  Suchergebnisse werden auf der Suche-Seite aufgelistet. Dein P-Parameter ist dann bedeutungslos. Oder er ist zwingend "p=search". Irgendwie hat alles andere von der Logik her keinen Sinn.

                                                                                  if (array_key_exists("s", $_GET)
                                                                                      && array_key_exists($_GET["s"], $pages)
                                                                                  ) {

                                                                                  
                                                                                  > ... den Array-key nicht erkennt, wenn er nach dem kaufmännischen "Undzeichen" (&) steht. Also er erkennt den Array-Key nicht in dieser URL: index.php?p=seit1&s=suchtag  
                                                                                    
                                                                                  Was willst Du denn genau prüfen? Den Suchbegriff als GET-Parameter? Die Logik Deines Codes verlangt, dass wenn "s=Freibier" im URL steht, dass dann auch ein Parameter "Freibier=irgendwas" im URL steht. Also wird Dein IF-Statement nur dann als zutreffend gewertet, wenn etwa das hier als URL aufgerufen wurde:  
                                                                                    
                                                                                  /index.php?p=trallala&s=mein%20Suchbegriff&mein%20Suchbegriff=Freibier  
                                                                                    
                                                                                  Ist das so gemeint? Sicherlich nicht. Es scheint mir eher so, als wolltest Du prüfen, ob es einen Seiten-Schlüssel gibt, auf den der Suchbegriff passt. Wenn also "anime" als Suchbegriff eingegeben wurde, es in $pages also den Schlüssel "anime" gibt, dann soll das IF-Statement als zutreffend verstanden werden. Aber so wirklich zielführend für eine Volltext-Suche erscheint mir das noch immer nicht.  
                                                                                    
                                                                                  Im Grunde willst Du doch so vorgehen:  
                                                                                    
                                                                                  1\.) Suchbegriff(e) feststellen (lower case transformiert)  
                                                                                  2\.) alle Seiten nach dem Textinhalt durchsuchen und Treffer in $array merken (Seitenschlüssel für P-Parameter)  
                                                                                  3\.) Schöne Liste mit anklickbaren Links ausgeben, optional noch mit dem Seitentitel als Klicktext  
                                                                                    
                                                                                  Im Grunde brauchst Du dafür eine Funktion, die Dir den textuellen Inhalt eines HTML-Dokuments liefert, ohne Markup. Dann transformierst Du den Textinhalt nach lower case (wozu GrOß-/kLeInScHrEiBuNg beim finden?) und lässt Deine Suchbegriffe drüber laufen.  
                                                                                    
                                                                                  Liebe Grüße,  
                                                                                    
                                                                                  Felix Riesterer.
                                                                                  
                                                                                  -- 
                                                                                  "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                                                  
                                                                                  1. Hallo Felix,

                                                                                    ich glaube ich habe mich schon wieder zu undirekt ausgedrückt. Mein Fehler ;) .

                                                                                    Ich habe eine Seite "Grammatik" .../index.php?p=japanisch_grammatik . In dieser soll jetzt Formular enthalten sein, wo der Benutzer ein Wort eingeben kann. Jenachdem, was er da jetzt eingibt für ein Wort (es ist wirklich immer nur ein Wort), soll dann eine Liste auf dieser Seite ausgespuckt werden mit möglichen Treffern, auf die man dann klicken kann... die dann auf dieser Seite einfach diese Liste mit dem Grammatikinhalt des jeweiligen Wortes ersetzt.
                                                                                    Sollte das mit dieser Liste zu umständlich sein, könnte auch einfach alles unter dem Suchfeld mit dem Inhalt des eingegeben Wortes ersetzt werden. Es sollte eigentlich keine neue Seite geladen werden. Nur der Inhalt auf dieser Seite sollte je nachdem, was er eingibt bzw. auf was der Benutzer raufdrückt sich verändern. Sodass immer die Seite ?p=japanisch_grammatik offen bleibt. Ich dachte mir das so, damit man nicht dauernd eine neue Seite Laden muss und sich das ganze flüssiger anfühlt.
                                                                                    Mein Problem ist 1. dass ich auch nicht genau weiß, ob sich sowas machen lässt, wie sinnvoll sowas ist und wie man sowas angeht. Ich hatte mich auch schon ein bisschen in AJAX und JQuery versucht einzulesen, aber ob ich das lieber damit machen sollte, weiß ich auch. Mein Problem (was ich momentan denke, was mein Problem ist), ist einfach die übergabe der Variable (was der Anwender in das Formular einträgt) an die PHP, ohne auf eine andere Seite zu springen.
                                                                                    Als kleines Beispiel, habe ich diese Seite.

                                                                                    http://www.renshuu.org/index.php?page=grammar/main

                                                                                    Gibt man in das "Search-Feld" in der Mitte der Website z.B. "node" ein, dann erscheint ein Fenster, ohne, dass die gesamte Seite neu geladen wird. An sowas dachte ich auch.

                                                                                    In was muss ich mich einlesen um sowas realisieren zu können. Also dynamische Inhalte in einer statischen Seite?

                                                                                    Liebe Grüße,

                                                                                    Simon P.

                                                                                    1. Lieber Simon P.,

                                                                                      ich glaube ich habe mich schon wieder zu undirekt ausgedrückt. Mein Fehler ;) .

                                                                                      tja, das ist eben so, wenn man in neuen thematischen Bereichen versucht, sich auszudrücken. Erst wenn man weiß, worum es bei der eigenen Frage eigentlich geht, wenn man auf diese also aufgrund inzwischen erlangten Wissens nicht mehr angewiesen ist, kann man sich so unmissverständlich ausdrücken, wie man es als Anfänger eben noch nicht kann, weshalb man ja gerade die Frage stellt.

                                                                                      Hmm.

                                                                                      Du willst also die Seite nicht neu laden müssen, nur damit der User das Gefühl hat, dass sich die Inhalte "schneller" zu ihm bewegen? Das macht man dann richtig, wenn man zweierlei Fälle technisch umsetzt:

                                                                                      1.) no JavaScript-Version
                                                                                      Die Seite übermittelt ein Formular an den Server. Dieser antwortet mit "einer neuen Seite", also einem HTML-Dokument, in dem die Antwort enthalten ist.

                                                                                      Diese Lösung ist ein "Muss", damit sie immer möglich ist. Suchabfragen werden üblicherweise mit einem GET-Request realisiert (<form method="get">). Das hat den Vorteil, dass man eine solche Suchseite verlinken kann.

                                                                                      Aber "auf der Seite bleiben" geht mit dieser Lösung nicht. Daher kommt nun aufbauend eine zweite (optionale!!) Lösung hinzu:

                                                                                      2.) JavaScript-AddOn
                                                                                      Mittels JavaScript "verbiegt" man das Formular dahingehend, dass die Anfrage nicht versandt wird, sondern von JavaScript "abgefangen" und weiter verarbeitet wird. Hier kommt nun das berüchtigte AJAX ins Spiel. JavaScript simuliert nun den Formularversand und wertet die Serverantwort aus, parst also das zu erwartende Antwort-HTML-Dokument auf die Inhalte hin, die als Ergebnisliste angezeigt werden sollen, um diese dann im aktuellen Dokument einzufügen.

                                                                                      Das erfordert fortgeschrittene Fähigkeiten in JavaScript. Ob Du dafür ein Framework wie jQuery nutzt, ist eine eher untergeordnete Frage. Wenn Du weißt, was Du in JavaScript tust, kannst Du ein Framework gut gebrauchen. Wenn Du noch nicht weißt, was Du in JavaScript tust, dann hilft Dir ein Framework vielleicht, dass "es funzt", ob Du aber verstanden hast, warum "es funzt", steht auf einem anderen Blatt.

                                                                                      Ich denke, Du bist gut damit beraten, die Formularanfrage zunächst mit einer regulären Ergebnisseite zu beantworten. Den JavaScript-Aufsetzer mit AJAX kannst Du Dir immer noch überlegen.

                                                                                      Als kleines Beispiel, habe ich diese Seite.

                                                                                      http://www.renshuu.org/index.php?page=grammar/main

                                                                                      Gibt man in das "Search-Feld" in der Mitte der Website z.B. "node" ein, dann erscheint ein Fenster, ohne, dass die gesamte Seite neu geladen wird.

                                                                                      Diese Seite macht in meinen Augen Mist. Wenn ich die Ergebnisseite bookmarken will, dann lande ich ohne Ergebnisse auf der "leeren" Formularseite. Die verbiegen die Suchanfrage zu einem Hash (alles, was in der URL nach dem "#"-Zeichen steht), was ich hier ein absolutes Unding finde, da es vom Server nicht berücksichtigt wird. Du solltest das besser machen - wenn Du es unbedingt machen willst.

                                                                                      Liebe Grüße,

                                                                                      Felix Riesterer.

                                                                                      --
                                                                                      "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                                                                                      1. Hallo Felix,

                                                                                        Hmm.

                                                                                        Du willst also die Seite nicht neu laden müssen, nur damit der User das Gefühl hat, dass sich die Inhalte "schneller" zu ihm bewegen? Das macht man dann richtig, wenn man zweierlei Fälle technisch umsetzt:

                                                                                        1.) no JavaScript-Version
                                                                                        Die Seite übermittelt ein Formular an den Server. Dieser antwortet mit "einer neuen Seite", also einem HTML-Dokument, in dem die Antwort enthalten ist.

                                                                                        Diese Lösung ist ein "Muss", damit sie immer möglich ist. Suchabfragen werden üblicherweise mit einem GET-Request realisiert (<form method="get">). Das hat den Vorteil, dass man eine solche Suchseite verlinken kann.

                                                                                        Okay, ich glaube, ich sollte diese Lösung ersteinmal in Betracht ziehen. Wie sollte ich nun Anfang bzw. wie geht man an solch eine Aufgabenstellung heran? Und an wen sende ich die Daten, die ich mit "$_GET" übertragen werde (also die Suchanfrage)?

                                                                                        Diese Seite macht in meinen Augen Mist. Wenn ich die Ergebnisseite bookmarken will, dann lande ich ohne Ergebnisse auf der "leeren" Formularseite. Die verbiegen die Suchanfrage zu einem Hash (alles, was in der URL nach dem "#"-Zeichen steht), was ich hier ein absolutes Unding finde, da es vom Server nicht berücksichtigt wird. Du solltest das besser machen - wenn Du es unbedingt machen willst.

                                                                                        Das lass ich dann erstmal außenvor.

                                                                                        Liebe Grüße,

                                                                                        Simon P.

                                                                                        1. Hallo Felix,

                                                                                          ich habe gestern noch einmal rumprobiert wie ich meine Suche machen könnte, aber ich wäre fast vor ärger über mich selbst geplatzt, dass ich nicht verstehe, wie die Übergabe und ... ja die Suche halt funktionieren soll. Ich komm nicht Hinter die Abfolge, wie in diesem Fall die Website arbeitet. Wenn ich die Daten aus dem $_GET an eine neue PHP sende... wie bleibt mir das Design, Navi, News etc. meiner Website erhalten. Und wie komme ich zurück zur index.php, fals der Besucher zurück zu einer anderen Seite möchte.
                                                                                          Ich weiß, dass eine PHP eine Serverseitige Geschichte ist. Das bedeutet, dass ich der neuen (nennen wir sie mal "search.php") sagen muss, dass sie alles trotzdem so lassen muss, wie es vorher war... und da komme ich nicht hinter... da ich ja das template system habe.
                                                                                          Hast du einen Verständnis Tipp?

                                                                                          Liebe Grüße,

                                                                                          Simon P.

                2. Okay. Ich habe das jetzt probiert, aber ich stehe im Prinzip bei dem Problem am Anfang. Anscheinend habe ich jetzt erst richtig verstanden wo das Problem liegt. Undzwar, dass der Verweis sich ja mit jedem Datensatz auch verändern muss, hier mein Quelltext. Die CSS habe ich erstmal aus deinem Fiddle übernommen (nur zum Test).

                  <h1><b>Serien</b></h1>
                              <?php
                              include("login.php");
                              ?>
                              <ul id="list">
                                  <?php
                                  $result = mysqli_query($db, "SELECT Name, ID, Genre, Datum, Bewertung, Typ,   Episoden FROM Serien");
                                  while($row = mysqli_fetch_object($result))
                                  {
                                      /*$s = 1;*/
                                      echo
                                      '<li><h2>' ."$row->Name". '<a href="/*$*/s">Details</a></h2>
                                      <dl id="s1">
                                          <dt>Datenbank ID</dt>
                                          <dd>' ."$row->ID". '</dd>
                                          <dt>Name</dt>
                                          <dd>' ."$row->Name". '</dd>
                                          <dt>Genre</dt>
                                          <dd>' ."$row->Genre". '</dd>
                                          <dt>Datum</dt>
                                          <dd>' ."$row->Datum". '</dd>
                                          <dt>Bewertung</dt>
                                          <dd>' ."$row->Bewertung". '</dd>
                                          <dt>Typ</dt>
                                          <dd>' ."$row->Typ". '</dd>
                                          <dt>Episoden</dt>
                                          <dd>' ."$row->Episoden". '</dd>
                                      </dl>
                                      </li>';
                                      /*$s++;*/
                                  }
                                  ?>
                              </ul>
                  Würde ich jetzt für jeden Datensatz einen eigenen Verweis anlegen... dann bräuchte ich die Datenbank ja nicht, dann könnte ich es ja alles händisch machen. Lasse ich den Verweis auf z.B. #s1, dann wird, wenn ich auf Anzeigen klicke, nur der letzte Datensatz angezeigt.
                  Ich probier mal in der Zwischenzeit weiter, vielleicht finde ich eine Lösung.

                  Grüße Simon P.

                  1. Lieber Simon P.,

                    Okay. Ich habe das jetzt probiert, aber ich stehe im Prinzip bei dem Problem am Anfang. Anscheinend habe ich jetzt erst richtig verstanden wo das Problem liegt. Undzwar, dass der Verweis sich ja mit jedem Datensatz auch verändern muss,

                    nein, das war nicht der Kern Deines Problems. Es war nur ein Detail, das eine JavaScript-basierte Lösung scheitern lies. Dein Hauptproblem war die konzeptionelle Vermischung verschiedener Techniken, insbesondere das Vermischen von serverseitig und clientseitig.

                    hier mein Quelltext.

                    Mal schauen.

                    <h1><b>Serien</b></h1>

                    Wozu das <b>-Element? Du kannst doch im CSS Fettschrift einstellen! Schau in mein Fiddle (egal welches). Dort steht die Eigenschaft "font-weight:bold", was genau den visuellen Effekt des <b>-Elements erzeugt.

                    Du hast eines noch nicht 100%ig verinnerlicht: Es ist HTML völlig egal, wie etwas aussehen soll, denn HTML regelt kein Aussehen, sondern nur Struktur und Beziehung. Löse also visuelle Probleme nicht mit HTML!!

                    <?php
                                include("login.php");
                                ?>

                    Was auch immer dieses Teil macht, es scheint mir, als solltest Du noch stärker zwischen DB-Abfrage und HTML-Ausgabe unterscheiden. Mal weiter sehen.

                    <ul id="list">
                                    <?php
                                    $result = mysqli_query($db, "SELECT Name, ID, Genre, Datum, Bewertung, Typ,   Episoden FROM Serien");
                                    while($row = mysqli_fetch_object($result))
                                    {
                                        /*$s = 1;*/

                    Du brauchst eine ID. Ob das eine aufsteigende Ganzzahl wie in meinem Beispiel ist, oder ob es tatsächlich der ID-Index Deiner DB ist, spielt doch keine Rolle! Das teil muss einmalig im Dokument sein!

                    echo
                                        '<li><h2>' ."$row->Name". '<a href="/*$*/s">Details</a></h2>
                                        <dl id="s1">

                    Also doch wieder dieselbe ID wie vorher... Schade! Warum nicht $row->ID an dieser Stelle, statt der Ziffer eins?

                    <dt>Datenbank ID</dt>
                                            <dd>' ."$row->ID". '</dd>
                                            <dt>Name</dt>
                                            <dd>' ."$row->Name". '</dd>
                                            <dt>Genre</dt>
                                            <dd>' ."$row->Genre". '</dd>
                                            <dt>Datum</dt>
                                            <dd>' ."$row->Datum". '</dd>
                                            <dt>Bewertung</dt>
                                            <dd>' ."$row->Bewertung". '</dd>
                                            <dt>Typ</dt>
                                            <dd>' ."$row->Typ". '</dd>
                                            <dt>Episoden</dt>
                                            <dd>' ."$row->Episoden". '</dd>
                                        </dl>
                                        </li>';

                    Jetzt sehe ich endlich die Struktur, die Du bisher verheimlicht hast. OK. Da lässt sich was draus machen.

                    /*$s++;*/

                    Tja, wenn Du in einem Schleifendurchlauf zu Beginn eine Variable auf einen festen Wert setzt ("$s = 1;"), dann nützt es Dir überhaupt nichts, wenn Du an dieser Stelle den Wert kontinuierlich hochzählen lassen willst, denn im nächsten Durchlauf wird er ja wieder zurück gesetzt.

                    Du willst die Variable $s _vor_ der While-Schleife auf eins setzen. Dann zählt sie in der Schleife immer höher.

                    Würde ich jetzt für jeden Datensatz einen eigenen Verweis anlegen... dann bräuchte ich die Datenbank ja nicht, dann könnte ich es ja alles händisch machen.

                    Das könntest Du sowieso. Es ist an dieser Stelle fraglich inwiefern der Einsatz eines Datenbankservers hier notwendig ist. Aus meiner Sicht hat er nur dann einen Sinn, wenn Du den Umgang mit MySQL aus PHP heraus lernen willst. Ansonsten ist Dein Problem völlig ohne DB lösbar - und das nicht nur deshalb, weil Du die Daten in einer "rohen" Form auch aus einer Datei einlesen könntest...

                    Lasse ich den Verweis auf z.B. #s1, dann wird, wenn ich auf Anzeigen klicke, nur der letzte Datensatz angezeigt.

                    Ist das logisch...? ;-)

                    Ich probier mal in der Zwischenzeit weiter, vielleicht finde ich eine Lösung.

                    Ich mache Dir noch einen Vorschlag:

                    <?  
                      
                    // data to be received from DB  
                    $data = array();  
                      
                    // connect to DB  
                    include 'login.php';  
                      
                    // get data from DB  
                    $result = mysqli_query(  
                        $db,  
                        'SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien'  
                    );  
                      
                    while ($row = mysqli_fetch_object($result)) {  
                        // add a set to our data  
                        $data[] = array(  
                            'date'     => $row->Datum,  
                            'episodes' => $row->Episoden,  
                            'eval'     => $row->Bewertung,  
                            'genre'    => $row->Genre,  
                            'id'       => $row->ID,  
                            'name'     => $row->Name,  
                            'type'     => $row->Typ  
                        );  
                    }  
                      
                    // now DB connection is no longer needed  
                    // FIXME close DB connection  
                      
                    // create HTML  
                    $ul = '<ul>';  
                      
                    foreach ($data as $set) {  
                      
                        $ul .= [link:http://de3.php.net/manual/en/function.sprintf.php@title=sprintf](  
                            '<li>'  
                            . '<h2>%2$s <a href="s%1$s">Details</a></h2>'  
                            . '<dl id="s%1$s">'  
                            . '<dt>Datenbank ID</dt><dd>%1$s</dd>'  
                            . '<dt>Name</dt><dd>%2$s</dd>'  
                            . '<dt>Genre</dt><dd>%3$s</dd>'  
                            . '<dt>Datum</dt><dd>%4$s</dd>'  
                            . '<dt>Bewertung</dt><dd>%5$s</dd>'  
                            . '<dt>Typ</dt><dd>%6$s</dd>'  
                            . '<dt>Episoden</dt><dd>%7$s</dd>'  
                            . '<dd><a href="#c%1$s" id="c%1$s">x</a></dd>'  
                            . '</dl>'  
                            . '</li>',  
                      
                            [link:http://de3.php.net/manual/en/function.htmlspecialchars.php@title=htmlspecialchars]($set['id']),  
                            htmlspecialchars($set['name']),  
                            htmlspecialchars($set['genre']),  
                            htmlspecialchars($set['date']),  
                            htmlspecialchars($set['eval']),  
                            htmlspecialchars($set['type']),  
                            htmlspecialchars($set['episodes'])  
                        );  
                    }  
                      
                    $ul .= '</ul>';
                    

                    Ich gehe jetzt einfach einmal davon aus, dass Du meine andere Antwort genau so umgesetzt hast. Wir benötigen also einen Patch, damit "dynamische" Seiteninhalte durch Zusatz-Scripte eingebunden werden können:

                    // put it all together  
                    $tmp = str_replace(  
                        array('{$contents}', '{$news}'),  
                        array(  $contents,     $news  ),  
                        $tmp  
                    );  
                      
                    // include additional scripts  
                    include 'serien.php'; // for ?p=serien  
                      
                    // send everything to the browser  
                    echo $tmp;  
                      
                    ?>
                    

                    Das Zusatz-Script für "serien" könnte jetzt so aussehen:

                    Datei "serien.php":

                    <?php  
                      
                    // we react to "?p=serien" in the URL  
                    if (array_key_exists('p', $_GET) && 'p' == 'serien') {  
                      
                        // data to be received from DB  
                        $data = array();  
                      
                        // connect to DB  
                        include 'login.php';  
                      
                        // get data from DB  
                        $result = mysqli_query(  
                            $db,  
                            'SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien'  
                        );  
                      
                        while ($row = mysqli_fetch_object($result)) {  
                            // add a set to our data  
                            $data[] = array(  
                                'date'     => $row->Datum,  
                                'episodes' => $row->Episoden,  
                                'eval'     => $row->Bewertung,  
                                'genre'    => $row->Genre,  
                                'id'       => $row->ID,  
                                'name'     => $row->Name,  
                                'type'     => $row->Typ  
                            );  
                        }  
                      
                        // now DB connection is no longer needed  
                    // FIXME close DB connection  
                      
                        // create HTML  
                        $ul = '<ul>';  
                      
                        foreach ($data as $set) {  
                      
                            $ul .= [link:http://de3.php.net/manual/en/function.sprintf.php@title=sprintf](  
                                '<li>'  
                                . '<h2>%2$s <a href="s%1$s">Details</a></h2>'  
                                . '<dl id="s%1$s">'  
                                . '<dt>Datenbank ID</dt><dd>%1$s</dd>'  
                                . '<dt>Name</dt><dd>%2$s</dd>'  
                                . '<dt>Genre</dt><dd>%3$s</dd>'  
                                . '<dt>Datum</dt><dd>%4$s</dd>'  
                                . '<dt>Bewertung</dt><dd>%5$s</dd>'  
                                . '<dt>Typ</dt><dd>%6$s</dd>'  
                                . '<dt>Episoden</dt><dd>%7$s</dd>'  
                                . '<dd><a href="#c%1$s" id="c%1$s">x</a></dd>'  
                                . '</dl>'  
                                . '</li>',  
                      
                                [link:http://de3.php.net/manual/en/function.htmlspecialchars.php@title=htmlspecialchars]($set['id']),  
                                htmlspecialchars($set['name']),  
                                htmlspecialchars($set['genre']),  
                                htmlspecialchars($set['date']),  
                                htmlspecialchars($set['eval']),  
                                htmlspecialchars($set['type']),  
                                htmlspecialchars($set['episodes'])  
                            );  
                        }  
                      
                        $ul .= '</ul>';  
                      
                        // insert HTML into template  
                        $tmp =  str_replace('{$serien}', $ul, $tmp);  
                    }  
                      
                    ?>
                    

                    Das HTML der Datei "pages/serien.html" sähe dann in etwa so aus:

                      
                            <h1>Serien</h1>  
                    {$serien}
                    

                    Falls Du noch mehr Seiten mit "dynamischen" Inhalten haben willst, dann lohnt es sich, dass Du für jede Seite ein eigenes Zusatz-Script schreibst und es wie oben beschrieben vor der Ausgabe an den Browser includierst. Vielleicht willst Du ja einmal ein Gästebuch haben...

                    Liebe Grüße,

                    Felix Riesterer.

                    --
                    "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                    1. Lieber Felix,

                      hier mein Quelltext.

                      Mal schauen.

                      <h1><b>Serien</b></h1>

                      Wozu das <b>-Element? Du kannst doch im CSS Fettschrift einstellen! Schau in mein Fiddle (egal welches). Dort steht die Eigenschaft "font-weight:bold", was genau den visuellen Effekt des <b>-Elements erzeugt. Du hast eines noch nicht 100%ig verinnerlicht: Es ist HTML völlig egal, wie etwas aussehen soll, denn HTML regelt kein Aussehen, sondern nur Struktur und Beziehung. Löse also visuelle Probleme nicht mit HTML!!

                      Okay, soweit verstanden, also auch kein <i> oder <em> oder <strong> etc.. Wozu sind die Elemente dann gedacht? Und sparrt das nicht Quelltext = weniger Ladezeit (natürlich nur im geringen). Das in CSS nur Design und in HTML nur Text gemacht wird, ist mir klar, ich dachte, dass ich dennoch einfach dieses, wie eben <b> oder <i> der Einfachheit halber benutzen kann.

                      Was auch immer dieses Teil macht, es scheint mir, als solltest Du noch stärker zwischen DB-Abfrage und HTML-Ausgabe unterscheiden. Mal weiter sehen.

                      Die Login.php ist bei mir das hier:

                      <?php $db = mysqli_connect("localhost", "benutzername", "passwort", "datenbank"); if(!$db){    exit("Verbindungsfehler: ".mysqli_connect_error()); } $db->query("SET NAMES 'utf8'"); ?>

                      Jetzt sehe ich endlich die Struktur, die Du bisher verheimlicht hast. OK. Da lässt sich was draus machen.

                      Diese Struktur hatte ich nicht, ich habe deine Struktur übernommen. Aber so wie ich dich verstanden habe, ist das auch nicht die feine Art, da ich ja HTML code in PHP integriert habe. Ich möchte wirklich versuchen, ordentlich zu arbeiten, aber bis jetzt habe ich noch wenig PHP Kenntnisse, so dass ich nicht weiß, wie ich eine Webside auf PHP-Basis aufbaue und mein HTML Text (der ja dann die Webside sein soll) dort hineinfüge, so, dass alles schön getrennt ist.

                      Tja, wenn Du in einem Schleifendurchlauf zu Beginn eine Variable auf einen festen Wert setzt ("$s = 1;"), dann nützt es Dir überhaupt nichts, wenn Du an dieser Stelle den Wert kontinuierlich hochzählen lassen willst, denn im nächsten Durchlauf wird er ja wieder zurück gesetzt.

                      Als ich das gelesen habe, habe ich über meine eigene Dummheit lauthals gelacht ;-).

                      Das könntest Du sowieso. Es ist an dieser Stelle fraglich inwiefern der Einsatz eines Datenbankservers hier notwendig ist. Aus meiner Sicht hat er nur dann einen Sinn, wenn Du den Umgang mit MySQL aus PHP heraus lernen willst. Ansonsten ist Dein Problem völlig ohne DB lösbar - und das nicht nur deshalb, weil Du die Daten in einer "rohen" Form auch aus einer Datei einlesen könntest...

                      Ich habe in meiner Ausbildung gelernt (wir haben nur mit MS Access gearbeitet), dass der große Vorteil von Datenbanken die Beziehungen zueinander sind. Da ich nicht weiß, ob ich das nochmal benötige und der Ordentlichkeit halber, habe ich die Daten in die mySQL Datenbank gepackt. Außerdem möchte ich lernen, wie ich mit mySQL und PHP arbeite, da es mir unglaublich viel Freude bereitet. Leider beherrsche ich es noch nicht so, dass es das außschließlich tut, es bereitet mir momentan auch unglaublich viel Kopfzerbrechen hinter die Logik zu kommen.

                      Ist das logisch...? ;-)

                      Ich denke ja.

                      Ich probier mal in der Zwischenzeit weiter, vielleicht finde ich eine Lösung.

                      Ich habe deinen ersten Vorschlag umgesetzt und alles hat wunderbar funkioniert. Einziges Manko ist, dass wenn ich das Fenster mit "x" schließe, dass der Browser mir unter die <h2> springt. Das ist aber erstmal nicht weiter schlimm. (der macht das nicht, wenn ich ganz nach unten scrolle [ca. 50 Datensätze].

                      Ich mache Dir noch einen Vorschlag:

                      <?
                      
                      > 
                      > // data to be received from DB
                      > $data = array();
                      
                      
                      > // connect to DB
                      > include 'login.php';
                      > 
                      > // get data from DB
                      > $result = mysqli_query(
                      >     $db,
                      >     'SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien'
                      > );
                      > 
                      > while ($row = mysqli_fetch_object($result)) {
                      >     // add a set to our data
                      >     $data[] = array(
                      >         'date'     => $row->Datum,
                      >         'episodes' => $row->Episoden,
                      >         'eval'     => $row->Bewertung,
                      >         'genre'    => $row->Genre,
                      >         'id'       => $row->ID,
                      >         'name'     => $row->Name,
                      >         'type'     => $row->Typ
                      >     );
                      > }
                      
                      Bis hierhin verstanden. -> Also erst wird ein leeres Array erstellt, dann eingeloggt, die Daten werden in $data[] geschrieben und den jeweiligen Key zugewiesen. Soweit so gut. Nun die erste Frage. Wird durch die Schleife für jeden Datensatz ein neues Array erstellt oder sind in z.B. "date" jetzt die Daten von allen Datensätzen hintereinander in dem Array?
                      
                      
                      > // now DB connection is no longer needed
                      > // FIXME close DB connection
                      
                      FIXME?
                      
                      
                      > // create HTML
                      > $ul = '<ul>';
                      > 
                      > foreach ($data as $set) {
                      
                      aus $data wird jetzt $set. Nur damit wir nun mit $set auf die Daten innerhalb der Schleife zugreifen können oder?
                      
                      
                      >     $ul .= [sprintf](http://de3.php.net/manual/en/function.sprintf.php)(
                      >         '<li>'
                      
                      Ich habe mir sprintf durchgelesen... .
                      
                      
                      >         . '<h2>%2$s <a href="s%1$s">Details</a></h2>'
                      
                      ab hier wird es schwierig für mich:
                      
                      % = es müssen keine Daten enthalten sein
                      2 = verstehe ich nicht woher die kommt
                      $ = verstehe ich auch nicht woher das Zeichen kommt
                      s = wird als String ausgegeben
                      
                      und was in href="" steht... sagt mir dann auch nichts mehr.
                      
                      
                      >         . '<dl id="s%1$s">'
                      >         . '<dt>Datenbank ID</dt><dd>%1$s</dd>'
                      >         . '<dt>Name</dt><dd>%2$s</dd>'
                      >         . '<dt>Genre</dt><dd>%3$s</dd>'
                      >         . '<dt>Datum</dt><dd>%4$s</dd>'
                      >         . '<dt>Bewertung</dt><dd>%5$s</dd>'
                      >         . '<dt>Typ</dt><dd>%6$s</dd>'
                      >         . '<dt>Episoden</dt><dd>%7$s</dd>'
                      >         . '<dd><a href="#c%1$s" id="c%1$s">x</a></dd>'
                      >         . '</dl>'
                      >         . '</li>',
                      
                      Es scheint das gleiche wie im Besipiel 1 zu sein nur anders. Aber dennoch ist HTML-Code mit PHP-Code gemischt.
                      
                      
                      >         [htmlspecialchars](http://de3.php.net/manual/en/function.htmlspecialchars.php)($set['id']),
                      
                      Hab ich mir auch durchgelesen... aber mein Kopf raucht jetzt schon und ich komme mit dieser Erklärung auf der Webside nicht so ganz klar... ich verstehe das nicht (-.-;
                      
                      
                      >         htmlspecialchars($set['name']),
                      >         htmlspecialchars($set['genre']),
                      >         htmlspecialchars($set['date']),
                      >         htmlspecialchars($set['eval']),
                      >         htmlspecialchars($set['type']),
                      >         htmlspecialchars($set['episodes'])
                      >     );
                      > }
                      > 
                      > $ul .= '</ul>';
                      
                      

                      Ich gehe jetzt einfach einmal davon aus, dass Du genau so umgesetzt hast. Wir benötigen also einen Patch, damit "dynamische" Seiteninhalte durch Zusatz-Scripte eingebunden werden können:

                      // put it all together
                      
                      > $tmp = str_replace(
                      >     array('{$contents}', '{$news}'),
                      >     array(  $contents,     $news  ),
                      >     $tmp
                      > );
                      > 
                      > // include additional scripts
                      > include 'serien.php'; // for ?p=serien
                      > 
                      > // send everything to the browser
                      > echo $tmp;
                      > ?>
                      
                      

                      Okay, hier füge ich in die index.php nur die serien.php hinzu...

                      Das Zusatz-Script für "serien" könnte jetzt so aussehen:

                      Datei "serien.php":

                      <?php
                      
                      > 
                      > // we react to "?p=serien" in the URL
                      > if (array_key_exists('p', $_GET) && 'p' == 'serien') {
                      
                      Leider nicht verstanden. Ich verstehe nicht was p und GET in dieser if Anweisung überprüfen soll.
                      
                      >     // data to be received from DB
                      >     $data = array();
                      > 
                      >     // connect to DB
                      >     include 'login.php';
                      > 
                      >     // get data from DB
                      >     $result = mysqli_query(
                      >         $db,
                      >         'SELECT Name, ID, Genre, Datum, Bewertung, Typ, Episoden FROM Serien'
                      >     );
                      > 
                      >     while ($row = mysqli_fetch_object($result)) {
                      >         // add a set to our data
                      >         $data[] = array(
                      >             'date'     => $row->Datum,
                      >             'episodes' => $row->Episoden,
                      >             'eval'     => $row->Bewertung,
                      >             'genre'    => $row->Genre,
                      >             'id'       => $row->ID,
                      >             'name'     => $row->Name,
                      >             'type'     => $row->Typ
                      >         );
                      >     }
                      > 
                      >     // now DB connection is no longer needed
                      > // FIXME close DB connection
                      > 
                      >     // create HTML
                      >     $ul = '<ul>';
                      > 
                      >     foreach ($data as $set) {
                      > 
                      >         $ul .= [sprintf](http://de3.php.net/manual/en/function.sprintf.php)(
                      >             '<li>'
                      >             . '<h2>%2$s <a href="s%1$s">Details</a></h2>'
                      >             . '<dl id="s%1$s">'
                      >             . '<dt>Datenbank ID</dt><dd>%1$s</dd>'
                      >             . '<dt>Name</dt><dd>%2$s</dd>'
                      >             . '<dt>Genre</dt><dd>%3$s</dd>'
                      >             . '<dt>Datum</dt><dd>%4$s</dd>'
                      >             . '<dt>Bewertung</dt><dd>%5$s</dd>'
                      >             . '<dt>Typ</dt><dd>%6$s</dd>'
                      >             . '<dt>Episoden</dt><dd>%7$s</dd>'
                      >             . '<dd><a href="#c%1$s" id="c%1$s">x</a></dd>'
                      >             . '</dl>'
                      >             . '</li>',
                      > 
                      >             [htmlspecialchars](http://de3.php.net/manual/en/function.htmlspecialchars.php)($set['id']),
                      >             htmlspecialchars($set['name']),
                      >             htmlspecialchars($set['genre']),
                      >             htmlspecialchars($set['date']),
                      >             htmlspecialchars($set['eval']),
                      >             htmlspecialchars($set['type']),
                      >             htmlspecialchars($set['episodes'])
                      >         );
                      >     }
                      > 
                      >     $ul .= '</ul>';
                      > 
                      >     // insert HTML into template
                      >     $tmp =  str_replace('{$serien}', $ul, $tmp);
                      > }
                      
                      Hier werden also die Daten irgendwie übergeben. Ich habe mir den PHP Vorschlag, mit der Trennung von HTML und PHP, noch nicht richtig angeschaut. Mein Kopf raucht, aber der Rauchmelder meldet noch nichts. Naja ich werde jetzt mal an die frische Luft gehen, sonst falle ich hier noch vom Stuhl. Danach schaue ich mir das nochmal an. Wichtig ist erstmal, dass mein Datenbank abfrage funktioniert... und das tut sie. Nun muss ich nur noch die Trennung richtig verstehen und dann sollte ich langsam wieder einen klaren Kopf bekommen.
                      
                      
                      > ?>
                      
                      

                      Das HTML der Datei "pages/serien.html" sähe dann in etwa so aus:

                      
                      
                      >         <h1>Serien</h1>
                      > {$serien}
                      
                      

                      Falls Du noch mehr Seiten mit "dynamischen" Inhalten haben willst, dann lohnt es sich, dass Du für jede Seite ein eigenes Zusatz-Script schreibst und es wie oben beschrieben vor der Ausgabe an den Browser includierst. Vielleicht willst Du ja einmal ein Gästebuch haben...

                      Den Link habe ich mir noch nicht angeguckt. Was meinst du denn mit dynamischen Inhalten? Ich übernehme auf meiner Webside keine Inhalte, die sich durch eine andere Webside ändern. Ich habe nur ein einfaches 3 Spalten Layout und fast außschließlich mit HTML und CSS gearbeitet... außer die mySQL Geschichte und die Include Geschichte. Was im Nachhinein noch dazu kommt... keine Ahnung. Ach und ich habe noch ein PHP-Befehl, der mir eine letzte Aktualisierung der Webside anzeigt, mehr php nicht. Javascript versuche ich fast komplett zu vermeiden... wo es halt geht. Mein einziges Javascript was ich momentan benutze ist lightbox.

                      Ich bin dir sehr dankbar, dass du mir so ausfürhlich hilfst und hoffe, dass du nicht an mir verzweifelst.

                      Liebe Grüße

                      Simon P.

                      1. Mahlzeit,

                        Okay, soweit verstanden, also auch kein <i> oder <em> oder <strong> etc.. Wozu sind die Elemente dann gedacht?

                        Ein relikt aus der Steinzeit, als es noch kein CSS gab ;)

                        Und sparrt das nicht Quelltext = weniger Ladezeit (natürlich nur im geringen).

                        Nein. Wenn die das CSS auf jeder Seite verwendest, wird es auch nur einmal geladen (Stichwort Cache). Somit _erhöhen_ zusätzlich Elemente im HTML-Code die Ladezeit.

                        ich dachte, dass ich dennoch einfach dieses, wie eben <b> oder <i> der Einfachheit halber benutzen kann.

                        Du kannst ja auch. Du kannst aber auch mit nem Trabbi von Hamburg nach Hong Kong fahren, willst du das? ;)

                        --
                        42
                        1. Om nah hoo pez nyeetz, M.!

                          Okay, soweit verstanden, also auch kein <i> oder <em> oder <strong> etc.. Wozu sind die Elemente dann gedacht?

                          Ein relikt aus der Steinzeit, als es noch kein CSS gab ;)

                          Nein. (Das Zwinkern hab ich wohl gesehen)

                          @Simon: Die Elemente dienen dazu, dem Inhalt eine besondere Bedeutung zu geben. Siehe http://wiki.selfhtml.org/wiki/HTML/Textauszeichnung, wobei das W3C den einst rein darstellungsbezogenen Elementen b, i und u eine neue Bedeutung gegeben hat.

                          Es wäre mMn besser gewesen, diese Elemente zu missbilligen, statt krampfhaft irgendeine semantische Bedeutung zu suchen.

                          Matthias

                          --
                          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Laus und Lauschaer Glas.

                          1. Mahlzeit,

                            Es wäre mMn besser gewesen, diese Elemente zu missbilligen, statt krampfhaft irgendeine semantische Bedeutung zu suchen.

                            Haben die auf Screenreadern eine besondere Bedeutung? Die dürften ja Probleme mit CSS haben, daher wären die in diesem Zusammenhang evtl. noch sinnvoll. Da ich aktuelle Screenreader nicht kenne, und keinen installiert hab, kann ich leider nicht testen. Evtl. jemand Erfahrung damit?

                            --
                            42
                              1. Mahlzeit,

                                Siehe http://blog.paciellogroup.com/2008/02/screen-readers-lack-emphasis/

                                Danke. Also lieber em und strong benutzen. Hab ich es ja direkt bisher richtig gemacht ;)
                                Ich gehe mal davon aus, das ist immer noch aktuell, auch wenn der Artikel von 2010 (Update) ist. Gibt an sich ja keinen Grund, es zu ändern.

                                --
                                42
                      2. Lieber Simon P.,

                        Okay, soweit verstanden, also auch kein <i> oder <em> oder <strong> etc..

                        das ist auch nicht richtig. Vor dem HTML5-Standard waren <i> und <b> verpönt, da sie ausschließlich dafür verwendet wurden, dass Schrift an der Stelle kursiv bzw. fett dargestellt wurde. Es waren also Elemente, die ausschließlich für die Darstellung im Browser "erfunden" wurden. Das stammt tatsächlich aus einer prä-CSS-Zeit.

                        Die Elemente <em> und <strong> haben dagegen keine visuelle Bedeutung, sondern eine hinsichtlich der Betonung. Dinge die <em>betont</em> oder <strong>stark betont</strong> werden, können auch visuell entsprechend dargestellt werden - aber eben nicht nur. Screenreader reagieren auf <em> anders als auf <strong>...

                        Aus meiner Sicht hätte es das <b>-Element niemals in den HTML5-Standard schaffen dürfen... aber was soll's.

                        Wozu sind die Elemente dann gedacht? Und sparrt das nicht Quelltext = weniger Ladezeit (natürlich nur im geringen). Das in CSS nur Design und in HTML nur Text gemacht wird, ist mir klar, ich dachte, dass ich dennoch einfach dieses, wie eben <b> oder <i> der Einfachheit halber benutzen kann.

                        HTML ist dazu da, eine Struktur abzubilden. HTML zeichnet Textschnipsel hinsichtlich ihrer Natur aus. Eine Überschrift ist eben ein Textschnipsel mit der Bedeutung "Überschrift". Dafür gibt es das <h1>-Element, je nach Hierarchie auch die Geschwister <h2>, <h3>... bis <h6>. Was genau soll ein <b>-Element über die Natur des Textschnipsels aussagen?

                        Mache Dir keine Gedanken über Ladezeiten bei HTML. Das kann man prima komprimieren, sodass lange HTML-Quelltexte nicht zwingend für lange Ladezeiten oder hohes Bandbreitenaufkommen sorgen. Bilder sind da wesentlich datenintensiver.

                        Die Login.php ist bei mir das hier:

                        <?php $db = mysqli_connect("localhost", "benutzername", "passwort", "datenbank"); if(!$db){    exit("Verbindungsfehler: ".mysqli_connect_error()); } $db->query("SET NAMES 'utf8'"); ?>

                        Wenn keine Verbindung zur DB möglich ist, bricht das Script ab und der Browser erhält ein leeres Dokument. Das ist keine gute Idee. Da fehlt irgendwie eine Fehlerbehandlung, damit die Seite wenigstens mit einer passenden Fehlermeldung an den Browser geschickt werden kann. Das könnte dann als Ergebnis so aussehen:

                        +------------------------------------+

                        |    Serien                          |                                    |    Keine Serien in der Datenbank   |    gefunden. Das tut uns leid™.    |                                    |

                        +------------------------------------+

                        Das ist allemal besser als ein leeres Dokument mit 0 Byte Datenmenge. Findest Du nicht?

                        Diese Struktur hatte ich nicht, ich habe deine Struktur übernommen.

                        Nein, ich meinte die Indices in Deiner DB. Wie sieht ein Datensatz aus? Jetzt weiß ich es.

                        Außerdem möchte ich lernen, wie ich mit mySQL und PHP arbeite, da es mir unglaublich viel Freude bereitet. Leider beherrsche ich es noch nicht so, dass es das außschließlich tut, es bereitet mir momentan auch unglaublich viel Kopfzerbrechen hinter die Logik zu kommen.

                        Dann bist Du hier absolut richtig.

                        Ich habe deinen ersten Vorschlag umgesetzt und alles hat wunderbar funkioniert. Einziges Manko ist, dass wenn ich das Fenster mit "x" schließe, dass der Browser mir unter die <h2> springt. Das ist aber erstmal nicht weiter schlimm. (der macht das nicht, wenn ich ganz nach unten scrolle [ca. 50 Datensätze].

                        Das ist ein Manko der JavaScript-losen Lösung. Mit JavaScript könnte man da vielleicht noch verschönern (man denke an die vielen Schritte, die der Zurück-Button des Browsers jetzt anbietet), aber das finde ich im Moment absolut nebensächlich.

                        while ($row = mysqli_fetch_object($result)) {     // add a set to our data     $data[] = array(         'date'     => $row->Datum,         'episodes' => $row->Episoden,         'eval'     => $row->Bewertung,         'genre'    => $row->Genre,         'id'       => $row->ID,         'name'     => $row->Name,         'type'     => $row->Typ     ); }

                        Bis hierhin verstanden. -> Also erst wird ein leeres Array erstellt, dann eingeloggt, die Daten werden in $data[] geschrieben und den jeweiligen Key zugewiesen.

                        Fast. Das Array $data wird der Reihe nach mit Inhalten gefüttert. Diese werden sozusagen mit einer "laufenden Nummer", beginnend mit 0, einsortiert. Die sogenannten Schlüssel des Arrays tragen Ganzzahlen beginnend mit der Null. In PHP kann ein Schlüssel ein beliebiger String-Wert oder eine Ganzzahl sein.

                        Soweit so gut. Nun die erste Frage. Wird durch die Schleife für jeden Datensatz ein neues Array erstellt oder sind in z.B. "date" jetzt die Daten von allen Datensätzen hintereinander in dem Array?

                        Die Daten, die in $date abgelegt werden, sind selbst wieder (kleine) Arrays. Diese sind im Grunde nur eine andere Form Deiner Datensätze. Diese kleinen Arrays haben keine numerischen Schlüssel wie $data, sondern "sprechende" Schlüssel wie "date", "id" usw. Dadurch kann ich für diesen einen Datensatz über den passenden Schlüssel auf die passende Eigenschaft zugreifen. Wir werden gleich sehen, wie das gemacht werden kann.

                        // now DB connection is no longer needed // FIXME close DB connection

                        FIXME?

                        Ja, englisch "to fix sth." bedeutet "etwas reparieren". Dieses "fixme" bedeutet "fix me", also "repariere mich" und ist eine übliche Anmerkung, dass hier im Code noch etwas nicht optimal ist, vorübergehend aber so belassen werden kann.

                        // create HTML $ul = '<ul>';

                        foreach ($data as $set) { aus $data wird jetzt $set. Nur damit wir nun mit $set auf die Daten innerhalb der Schleife zugreifen können oder?

                        Nein. Aus $data wird der Reihe nach jedes Element in die Variable $set kopiert, damit Du mit dieser arbeiten kannst. Damit enthält $set genau einen Datensatz aus der DB. Eine alternative Schreibweise um durch die Datensätze zu iterieren wäre diese:

                        for ($i = 0; i < count($data); $i++) {
                            $set = $data[$i];
                            ...
                        }
                        

                        Mit foreach spart man sich das Führen einer Zählvariablen und das Prüfen auf die maximale Anzahl der Elemente im Array. Außerdem könnte es in PHP ja sein, dass ein Schlüssel fehlt! Da erhalte ich in der For-Schleife einen Fehler (mit Script-Abbruch), in der Foreach-Schleife dagegen nicht:

                        $data = array(
                            0 => 'nuller',
                            1 => 'einser',
                            7 => 'siebener',
                           10 => 'zehner'
                        );
                        
                        // $i zählt jetzt der Reihe nach von 0 bis 3, denn $data hat vier Elemente!
                        for ($i = 0; $i < count($data); $i++) {
                            echo $data[$i]; // klappt nur bei $i=0, $i=1, $i=7 und $i=10!
                        }
                        

                        Ich habe mir sprintf durchgelesen... .

                        . '<h2>%2$s <a href="s%1$s">Details</a></h2>' ab hier wird es schwierig für mich:

                        % = es müssen keine Daten enthalten sein 2 = verstehe ich nicht woher die kommt $ = verstehe ich auch nicht woher das Zeichen kommt s = wird als String ausgegeben

                        Die einfache Variante in sprintf Platzhalter zu notieren ist diese:

                        printf(
                            "Hallo %s, Du bist %02d Jahre alt und warst am %s zum letzten Mal hier.",
                            "Simon",
                            123456,
                            "20.07.2014"
                        );
                        

                        Dieses %-Zeichen leitet sozusagen einen Platzhalter ein. Danach kommt entweder eine Nummerierung (z.B. "3$" für drittes Ersetzungsargument), oder zusätzliche Parameter (z.B. 02 für "zweistellig" bei Zahlen-Platzhaltern wie d), gefolgt von der Art des Datums (String, Integer, Float etc.). Da ich die ID Deines Datensatzes mehrfach benötige, habe ich die Platzhalter durchnummeriert. Daher kommt das mit dem Dollarzeichen.

                        und was in href="" steht... sagt mir dann auch nichts mehr.

                        . '<dl id="s%1$s">'

                        Da steht im Wesentlichen "s%1$s", also "s" und das erste Ersetzungsargument (Deine Datensatz-ID), sodass es wahrscheinlich "s0", "s1", "s2" usw. werden wird.

                        Es scheint das gleiche wie im Besipiel 1 zu sein nur anders.

                        Ich liebe solche ultralogischen Sätze! ;-)

                        Aber dennoch ist HTML-Code mit PHP-Code gemischt.

                        htmlspecialchars($set['id']),

                        Es wird HTML-Code zusammengestellt, ja, aus Fragmenten. Aber reiner HTML-Code, wie er in den Dateien "home.html", "serien.html" oder "kontakt.html" zusammenhängend steht, ist aus Deinem Script draußen. Du unterbrichst <?php ... ?> nicht mehr. Damit kannst Du die Logik Deiner Scripte von den redaktionellen Inhalten getrennt verwalten.

                        [htmlspecialchars] Hab ich mir auch durchgelesen... aber mein Kopf raucht jetzt schon und ich komme mit dieser Erklärung auf der Webside nicht so ganz klar... ich verstehe das nicht (-.-;

                        Du weißt, dass in HTML bestimmte Zeichen eine bestimmte Bedeutung haben. Du darst nicht einfach ein &-Zeichen notieren. Das ist ungültiger Code! Deshalb ist es wichtig, dass Du bei variablen Daten (wie z.B. DB-Inhalt) kontextgerecht kodierst. Diese Funktion sorgt dafür, dass die ins HTML eingefügten Daten HTML-gerecht kodiert werden. Aus dem &-Zeichen würde dann "&amp;", eine XML- oder HTML-Entität.

                        // include additional scripts include 'serien.php'; // for ?p=serien

                        // send everything to the browser echo $tmp; ?>[/code]

                        Okay, hier füge ich in die index.php nur die serien.php hinzu...

                        Bis jetzt, ja. Wenn Du noch andere Seiten mit "aktiven Inhalten" hast, die ein PHP-Script zur korrekten Anzeige oder Funktionalität benötigen (z.B. Kontaktformular, Gästebuch, RSS-Feed etc.), dann brauchst Du hier weitere spezialisierte Teilscripte.

                        // we react to "?p=serien" in the URL if (array_key_exists('p', $_GET) && 'p' == 'serien') {

                        Leider nicht verstanden. Ich verstehe nicht was p und GET in dieser if Anweisung überprüfen soll.

                        Wenn der Browser eine Ressource der Art "http://example.com/?p=serien&f=foo" anfordert, dann steht da nach dem "?p=" genau das, was Du wissen willst. In PHP können solche sogenannten Search-Parameter über die superglobale Variable $_GET ermittelt werden. PHP befüllt dieses Array schon vor Deinem Script passend. Damit steht in $_GET['p'] der Wert "serien", in $_GET['f'] der Wert "foo" (der hier nur Unsinn wäre).

                        Mein Kopf raucht, aber der Rauchmelder meldet noch nichts. Naja ich werde jetzt mal an die frische Luft gehen, sonst falle ich hier noch vom Stuhl. Danach schaue ich mir das nochmal an. Wichtig ist erstmal, dass mein Datenbank abfrage funktioniert... und das tut sie.

                        Schön wäre, wenn "login.php" im Fehlerfalle etwas tut, das Dein Script weiterarbeiten ließe. Dann würde ich "Datenbank abfrage funktioniert" unterschreiben.

                        Was meinst du denn mit dynamischen Inhalten? Ich übernehme auf meiner Webside keine Inhalte, die sich durch eine andere Webside ändern.

                        Du meinst "website" mit "t" in "site". Und dynamische Inhalte sind die, die eine Programmlogik benötigen, um angezeigt zu werden. Das kann das Auslesen einer DB sein, das Verarbeiten von User-Eingaben (Kontaktformular/Gästebuch/Kommentarfeld...) oder sonstwas.

                        Ich bin dir sehr dankbar, dass du mir so ausfürhlich hilfst und hoffe, dass du nicht an mir verzweifelst.

                        Naja, ich kann in Zukunft bei anderen interessierten Anfängern einfach auf diesen Thread im Archiv verlinken.

                        Liebe Grüße,

                        Felix Riesterer.

                        --
                        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                        1. Lieber Felix,

                          HTML ist dazu da, eine Struktur abzubilden. HTML zeichnet Textschnipsel hinsichtlich ihrer Natur aus. Eine Überschrift ist eben ein Textschnipsel mit der Bedeutung "Überschrift". Dafür gibt es das <h1>-Element, je nach Hierarchie auch die Geschwister <h2>, <h3>... bis <h6>. Was genau soll ein <b>-Element über die Natur des Textschnipsels aussagen?

                          Ich werde warscheinlich die Daten auf mehreren Seiten ausgeben lassen, sodass ich unten einen Button habe, mit "weiter" oder ähnliches. Dafür würde ich dann einfach eine 2. HTML Seite mit der komplett gleichen CSS und dem komplett gleichen HTML-Code  anlegen nur, dass ich dann die Datensätze von ID 20 ablaufen lassen würde. Glaubst du das ist die beste Lösung? (Ich habe dein Vorschlag mit dem index.php noch nicht vollzogen. Ich werde das als erstes mal ausprobieren, vielleicht entdecke ich dann noch einen anderen Weg)

                          Mache Dir keine Gedanken über Ladezeiten bei HTML. Das kann man prima komprimieren, sodass lange HTML-Quelltexte nicht zwingend für lange Ladezeiten oder hohes Bandbreitenaufkommen sorgen. Bilder sind da wesentlich datenintensiver.

                          Die Login.php ist bei mir das hier:

                          <?php
                          $db = mysqli_connect("localhost", "benutzername", "passwort", "datenbank");
                          if(!$db){
                             exit("Verbindungsfehler: ".mysqli_connect_error());
                          }
                          $db->query("SET NAMES 'utf8'");
                          ?>

                          Wenn keine Verbindung zur DB möglich ist, bricht das Script ab und der Browser erhält ein leeres Dokument. Das ist keine gute Idee. Da fehlt irgendwie eine Fehlerbehandlung, damit die Seite wenigstens mit einer passenden Fehlermeldung an den Browser geschickt werden kann. Das könnte dann als Ergebnis so aussehen:

                          +------------------------------------+

                          |
                             Serien                          |
                                                             |
                             Keine Serien in der Datenbank   |
                             gefunden. Das tut uns leid™.    |
                                                             |
                          +------------------------------------+

                          Das eine Fehlermeldung erscheint habe ich doch schon mit der IF-Anweisung gelöst. Hier wird zwar der Fehlergrund angegeben, aber dort kann ich natürlich auch was anderes hinein schreiben oder meinst du was anderes?

                          Vielen Dank für deine super Auskunft. Soweit habe ich jetzt erstmal alles verstanden. Ich werde mal schauen, dass ich meine Webside optimiere. Momentan habe ich nämlich ca. 20 HTML Dateien, und 20 CSS Dateien... so solls ja nicht sein.

                          1. Hallo,

                            Ich werde mal schauen, dass ich meine Webside optimiere.

                            Bevor du es dir angewöhnst, weil niemand wiederholt widersprochen hat: das Wort "Webside" gibt es nicht! Siehe auch diese Antwort auf eines deiner Postings. Entweder Webseite oder Website.

                            Gruß
                            Kalk

                            1. Hallo Kalk,

                              Bevor du es dir angewöhnst, weil niemand wiederholt widersprochen hat: das Wort "Webside" gibt es nicht! Siehe auch diese Antwort auf eines deiner Postings. Entweder Webseite oder Website.

                              Danke dir für den Hinweis. Momentan raucht mein Kopf ab, deshalb achte ich kaum noch auf meine Rechtschreibung ;). Ich werde im Zukunft Website schreiben.

                              Gruß
                              Simon P.

                              1. @@Simon P.:

                                nuqneH

                                Entweder Webseite oder Website.

                                Und zwar je nach dem, welches von beiden jeweils gemeint ist.

                                Ich werde im Zukunft Website schreiben.

                                Aber schreib bitte nicht Website, wenn du Webseite meinst.

                                Qapla'

                                --
                                „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)
                          2. Hallo

                            HTML ist dazu da, eine Struktur abzubilden. HTML zeichnet Textschnipsel hinsichtlich ihrer Natur aus. Eine Überschrift ist eben ein Textschnipsel mit der Bedeutung "Überschrift". Dafür gibt es das <h1>-Element, je nach Hierarchie auch die Geschwister <h2>, <h3>... bis <h6>. Was genau soll ein <b>-Element über die Natur des Textschnipsels aussagen?

                            Ich werde warscheinlich die Daten auf mehreren Seiten ausgeben lassen, sodass ich unten einen Button habe, mit "weiter" oder ähnliches. Dafür würde ich dann einfach eine 2. HTML Seite mit der komplett gleichen CSS und dem komplett gleichen HTML-Code  anlegen nur, dass ich dann die Datensätze von ID 20 ablaufen lassen würde. Glaubst du das ist die beste Lösung?

                            Nein. Die zweite Seite ist wie die Erste, nur mit anderen Daten. Es bietet sich an … nein, es drängt sich gar förmlich auf, hier mit einer (typischerweise) serverseitigen Programmiersprache nachzuhelfen und beim wiederholten Aufruf der Seite – z.B. über deinen „weiter“-Button – die Datenbankabfrage zu manipulieren.

                            (Ich habe dein Vorschlag mit dem index.php noch nicht vollzogen. …)

                            Aha, PHP. Das ist also machbar. Ein gängiger Weg wäre, dem Button bzw. besser dem Link (der wie ein Button gestaltet sein mag) einen Parameter mitzugeben (z.B. seite=2, seite=3, etc. pp.) und anhand des Parameters zu entscheiden, welche Datensätze aus der Datenbank geladen werden sollen. Mit dem URL-Parameter legst du den Startwert für LIMIT fest und hast als Zweites dazu den festen Wert, der die Anzahl der auszugebenden Datensätze festlegt.

                            SELECT  
                              dies,  
                              das  
                            FROM irgendwas  
                              WHERE -- hier eventuell eine Bedingung, die ich nicht kenne  
                              LIMIT 20, 10 -- gib ab dem Startwert 20 10 Ergebnisse aus, der Startwert wird mit PHP eingefügt  
                              ORDER BY jenesFeld ASC
                            

                            Du hast damit nur eine Seite mit einem CSS-Regelsatz, die du pflegen musst und nicht derer 20 (oder mehr).

                            Tschö, Auge

                            --
                            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
                            Terry Pratchett, "Wachen! Wachen!"
                            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
                            Veranstaltungsdatenbank Vdb 0.3
      2. Lieber Simon P.,

        also gut, Du bist Anfänger. Das war offensichtlich. Dazu bedarf es weder einer Erklärung noch einer Entschuldigung, denn ich gehe davon aus, dass nicht nur ich hier auch einmal als Anfänger meine ersten Fragen gestellt habe...

        Leider kam ich in meiner Ausbildung und auch nun schon wieder noch nicht hinter die richtige Logik bei Arrays. Ich habe leider das Problem, dass halt denke, dass ich nur innerhalb dieser einen while schleife arbeiten kann, da ich ja sonst die komplette ausgabe meiner Daten unterbreche, was den Sinn hinter einer Datenbank ja sicherlich entgegen steht.

        Du wirfst hier zwei Sachen durcheinander.

        1.) Daten in der DB
        2.) aus der DB in ein Array eingelesene Daten (eine Auswahl aus der DB)

        Warum kann ich denn kein Array (man sagt auch "Feldvariable", stelle sie Dir wie einen Schrank mit elastischen Schubladen vor, die alle wie in Excel beschriftet sind) mit den aus der DB ausgelesenen Daten befüllen?

        Es ist manchmal sinnvoll, den DB-Zugriff als einen völlig eigenen Kontext zu verstehen, in dem SQL die Sprache der Wahl ist, und für den mit einem Server (MySQL oder dergleichen) mit allem pi-pa-po Kontakt aufgenommen werden muss. Das ist wie eine Browser-Abfrage, nur dass sich eben Dein PHP-Script analog wie ein Browser verhält, indem es die Antwort auf seine gestellte Anfrage verarbeitet.

        Du kannst bereits beim (stückweisen!) Erhalt der Antwort diese sofort in HTML-Kontext umwandeln und Dein Markup erzeugen, Du könntest aber auch ein eigenes PHP-Programm schreiben, welches nichts anderes tut, als tabellarische Daten in einer Tabelle auszugeben (mit HTML-Mitteln). Dein eigentliches PHP-Programm includiert erst die DB-Logik, hat dann die abgefragten Daten in einer Variablen gespeichert (Array) und includiert dann das Ausgabe-Programm, um die im Array enthaltenen Daten in HTML gießen zu lassen. Aktuell wird gerne das MVC-Pattern als idealer Programmaufbau gepredigt, in dem das dann so ähnlich ablaufen würde. Du musst nämlich davon ausgehen, dass man in einer DB viele verschiedenen Dinge abspeichern kann, die nicht unbedingt in Gänze in einem einzigen HTML-Dokument abgebildet werden müssen.

        Dann könnte ich auch alle Daten einfach in mein HTML-Dokument eintippen. "Markup" = alles was in "HTML" geschrieben ist (also kein php oder javascript), richtig oder?

        Ja und ja. Das könntest Du. HTML ist in der Tat ein Dateiformat. Da lassen sich Daten mit abspeichern. Je nach Menge der Daten und der beabsichtigten Verwendung ist der Weg von MySQL über PHP nach HTML vielleicht sprichwörtlich "mit Kanonen auf Spatzen geschossen". Aber zum Erlernen der Technologien und ihrer Verschränkung ist das allemal eine schöne Herausforderung.

        Du kannst Markup (HTML-Code) generieren, um es an den Browser zu senden. CSS und JavaScript erledigt dann der Browser. Da kann PHP sinnvollerweise nicht "mitreden".
        Wie mache ich das? Also allgemein baue ich meine Webside so auf, dass ich zu jeder HTML Datei eine CSS Datei habe, die ich halt in die HTML einbinde.

        Man hat üblicherweise _eine_ CSS-Datei, die man in allen HTML-Dokumenten referenziert (lies: einbindet). Das ist ja gerade die Idee, dass es nur eine ist, damit alle Dokumente eine einheitliche Darstellung haben. Es wäre nicht sinnvoll, für jede HTML-Datei eine eigene CSS-Datei anzulegen. Da wäre es tatsächlich sinnvoller, den CSS-Inhalt in einem <style>-Element im Kopfbereich (<head>-Element) des HTML-Dokumentes zu notieren. Immerhin ist es bei der Datenübertragung im Internet schneller, wenn nur eine Verbindung für eine Datei benötigt wird, anstatt zwei Verbindungen für zwei Dateien. Nur wenn die zweite Datei bereits im Browser-Cache liegt, weil eine andere HTML-Datei sie auch für das Layout benötigt hatte, hat es einen Sinn, CSS-Code auszulagern.

        Damit das schön getrennt ist (im Javascript nicht so, da ich den kopiert habe).

        Mein starker Verdacht ist, dass Du das mit JavaScript vielleicht ein wenig auf der Seite liegen lassen solltest. Deine Bedürfnisse lassen sich mit reinen CSS-Mitteln lösen. Erst wenn Du wirklich mit der reinen CSS-Lösung nicht mehr zufrieden bist, könnte (vielleicht!) der Einsatz von JavaScript sinnvoll sein.

        Sonst arbeite ich auch mit "inculde" von PhP z.B. für meine Login Daten für den mySQL - Zugang. Was meinst du jetzt mit "...generieren, um es an den Browser zu senden...". Was muss ich anders machen?

        Du musst überhaupt nichts anders machen. Dein PHP-Code generiert HTML-Code, der dann an den Browser ausgegeben wird. Das ist die Idee hinter dynamischen Webseiten.

        2.) <span> Verstanden! Die anderen sind doch dazu gedacht um die Schriftart zu verändern oder?

        HTML kennt keine Schriftart. Nein. Es geht darum, Deine Inhalte in einer sinnvollen Struktur abzubilden. Wie das hinterher aussieht, regelt CSS. Daher ist es ja so wichtig, dass die Struktur in Deinem Markup (HTML) sinnvoll (und syntaktisch korrekt) ist!

        3.) Das mit der ID weiß ich, sonst halt class. Ich benutze in diesem Beispiel die ID doch nur zweimal wegen der Schleife (darauf habe ich nicht geachtet, danke).

        Also keine ID. Schön. Mir war nicht klar, was da genau als Inhalt im Dokument später stehen soll, daher habe ich mich an der ID orientiert.

        Ok, das heißt ich arbeite dann mit <span> mit einer class, damit ich per CSS dieses Inline-Elemente formatieren kann.

        Nein. Die <span>-Elemente brauchen keine Klasse. Die erreichst Du über die ID des <ul>-Elements. In CSS gibt es ja den Nachfahren-Selektor. Mit dem kannst Du die <span>-Elemente per CSS "anfassen". Daher ja auch mein Beispiel, welches ich hier wiederhole:

        Besser so:

        <ul id="boxes">

        <li>
                Name 1
                <span>ID 1</span>
            </li>
            <li>
                Name 2
                <span>ID 2</span>
            </li>
            <li>
                Name 3
                <span>ID 3</span>
            </li>
        </ul>

        
        >   
        > Dein CSS sollte dann folgendes enthalten:  
        >   
        > ~~~css
        
        #boxes li span{  
        
        >     display: none;  
        > }  
        >   
        > #boxes li:hover span {  
        >     display: block;  
        >     position: absolute;  
        > }
        
        

        Wie Du sehen kannst, steht da "#boxes", was ein Element mit der ID "boxes" selektiert (das <ul>-Element). Für Dich habe ich es extra ausführlich notiert: #boxes li span - man hätte das "li" in der Mitte auch weglassen können. Das <span>-Element ist ja sozusagen der Enkel von <ul>. Enkel sind ebenso Nachfahren, wie Kinder es auch sind. Daher der "Nachfahren-Selektor".

        Wenn Du allerdings darauf reagieren lassen willst, dass sich der Mauszeiger gerade über einem Listenelement (<li>-Element) bewegt, dann kannst Du mit der Pseudoklasse ":hover" dafür sorgen, dass Nachfahren ihre Darstellung verändern. Im obigen Beispiel sind die <span>-Elemente mittels der Eigenschaft "display:none" auf nicht-sichtbar geschaltet. In dem Moment, wo der Mauszeiger über das <li>-Element fährt, gilt die Psuedoklasse ":hover", sodass der zweite Selektor (also das "#boxes li:hover span") gültig wird. Dieser Selektor selektiert dasjenige <span>-Element, dessen Vorfahre (<li>) gerade "übermaust" wird. Dadurch gelten für das <span>-Element nun die Regeln, die in diesem Ruleset definiert sind, darunter "display:block", was die Sichtbarkeit einschaltet. Das "position:absolute" sorgt dafür, dass die bisher verborgenen Inhalte sich überdeckend in den Vordergrund drängen.

        Ich habe Dir hier ein Fiddle erstellt, mit dem Du das ausprobieren kannst: Version mit :hover
        Bitte nicht wundern, ich habe eine etwas andere Struktur gewählt... die mir mehr Semantik ermöglicht.

        wie ich neben meinem Namen (was ein Serientitel werden soll) einen "Button" auf dem "Anzeigen" steht erzeuge,

        Wozu? Genügt Dir ein mouse-over nicht? Muss es für den Anfang zwingend ein Button sein? Auch wenn der einen Klick benötigt und damit tendenziell unbequemer wäre?

        Ich würder gerne per klick das akitivieren lassen, ginge das?

        Es gibt auch die Pseudoklassen :active und :focus. Erstere scheint sich für Deine Zwecke (bedingt) zu eigenen. Bleibt man mit der gedrückten Maustaste auf dem <li>-Element, erscheint der Zusatz-Kasten. Hier das Fiddle: Version mit :active

        5.) Das habe ich so gemacht, weil ich ja sonst wieder in mein PHP-Syntax eingegriffen hätte, das ich ja mit '' die Syntax vom Java eingeklammert habe (so hat es mir mein Editor angezeigt).

        Du kennst wohl den Backslash zum Maskieren noch nicht? Schau her:
        echo '<li><a href="#" onclick="toggleElementDisplay(\'box\')"></li>';
        Wie man sieht, wird die Zeichenkette ("string") mit Hilfe der Backslashes nicht unterbrochen, obwohl die einfachen Anführungszeichen um "box" herum den String sonst beenden müssten.

        Ich arbeite mit "Sublime" und habe mich regelrecht in diesen Editor verliebt (^_-).

        Also bist Du bestens ausgerüstet.

        Mit HTML komm ich ganz gut klar und auch in CSS fühle ich mich langsam sicherer,

        Ja, da gibt es noch viel zu entdecken...

        aber PHP und mySQL sind echt ein Brocken, den ich erstmal logisch verstehen muss.

        Und diese Sprachen sind noch "heftiger" als HTML und CSS. Das dauert.

        Liebe Grüße,

        Felix Riesterer.

        --
        "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        1. Om nah hoo pez nyeetz, Felix Riesterer!

          wie ich neben meinem Namen (was ein Serientitel werden soll) einen "Button" auf dem "Anzeigen" steht erzeuge,

          Wozu? Genügt Dir ein mouse-over nicht? Muss es für den Anfang zwingend ein Button sein? Auch wenn der einen Klick benötigt und damit tendenziell unbequemer wäre?

          Ich würder gerne per klick das akitivieren lassen, ginge das?

          Es gibt auch die Pseudoklassen :active und :focus. Erstere scheint sich für Deine Zwecke (bedingt) zu eigenen. Bleibt man mit der gedrückten Maustaste auf dem <li>-Element, erscheint der Zusatz-Kasten. Hier das Fiddle: Version mit :active

          Die Pseudoklasse target ist dafür u. U. besser geeignet. Siehe auch referenzieren sowie die Diskussion dazu.

          Matthias

          --
          Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Fest und Festräger.
          1. Lieber Matthias Apsel,

            und schon wieder habe ich etwas gelernt! Danke!

            Hier das aktualisierte Fiddle dazu: Version mit :target

            Liebe Grüße,

            Felix Riesterer.

            --
            "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
            1. Om nah hoo pez nyeetz, Felix Riesterer!

              und schon wieder habe ich etwas gelernt! Danke!

              Vielleicht könntest du im Gegenzug an dieser Stelle deine JavaScript-Erfahrung einbringen und eine Kleinigkeit dazu schreiben, wie man das möglicherweise unerwünschte Verhalten bezüglich der History unterbinden kann.

              Wiki-technisch kann dir bestimmt jemand helfen.

              Matthias

              --
              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Alte und Alternative.

              1. Lieber Matthias Apsel,

                <I> - schon verstanden. Danke.

                Wiki-technisch kann dir bestimmt jemand helfen.

                Muss das mal näher studieren. Auf der Diskussionsseite standen ja interessante Gedanken dazu... aber wenn ich eine solche Funktionalität haben möchte und dazu JS einsetze, will ich dann nicht lieber die Anker vernichten und das Ein-/Ausblenden JS machen lassen?

                Liebe Grüße,

                Felix Riesterer.

                --
                "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
                1. Hallo!

                  aber wenn ich eine solche Funktionalität haben möchte und dazu JS einsetze, will ich dann nicht lieber die Anker vernichten und das Ein-/Ausblenden JS machen lassen?

                  Kann man, wobei Fokussieren von gerade eingeblendeten Inhalten nach wie vor sinnvoll ist. Das kann zur Not natürlich auch mit JavaScript erfolgen (tabindex="0" und .focus()).

                  Mathias

              2. Hallo,

                Vielleicht könntest du im Gegenzug an dieser Stelle deine JavaScript-Erfahrung einbringen und eine Kleinigkeit dazu schreiben, wie man das möglicherweise unerwünschte Verhalten bezüglich der History unterbinden kann.

                Mit JavaScript kann man natürlich alles umkrempeln, aber dann braucht man :target nicht, sondern packt den Inhalt einfach an die jeweilige Stelle, versteckt ihn barrierefrei und fügt per JS einen Toggle-Link ein.

                Mit einem Screenreader ist die :target-Lösung nicht gut bedienbar. JAWS unter IE 11 springt zumindest beim Aktivieren des Details-Links zum gewünschten Inhalt, aber zum einen ist »X« kein guter Linktext und der Rücksprung funktioniert nicht. JAWS fängt wieder an, das Dokument von vorne zu lesen.

                Mathias

  2. Hi,

    1. Allgemeine Frage:
         Die Datensätze die ich mit Hilfe der "while-schleife" auslese, kann ich doch nur innerhalb dieser schleife anpassen, da ich doch sonst (wenn ich die Datensätze einzelnd ansprechen würde) keine Datenbank mehr bräuchte. Wie kann ich also innerhalb meiner PHP-Schleife, die Datensätze mit hilfe css bzw. html ansprechen?

    Mit HTML „sprichst“ du gar nichts an – HTML ist das, was deine Schleife ausgibt.

    Und diese HTML formatierst du genau so, als ob es die While-Schleife und PHP und Datenbank gar nicht geben würde – genauso, als wenn es sich um statisches HTML handeln würde, dass du von Hand geschrieben hättest.

    Wenn man das sich mal so ausgeben lässt, dann sieht das schon ganz gut aus... aber wenn ich auf "Click me!" drücke passiert einfach garnichts, außer das sich hinter der Url ein "#" rangesetzt hat.

    Da du uns dein JavaScript nicht gezeigt hast, können wir nicht wissen, woran das liegt. Als erstes könntest du aber mal in die Fehlerkonsole deines Browsers schauen.

    Allerdings ist dein HTML auf jeden Fall invalid – zum einen, weil du ein Div in einen P-Absatz packst, und zum anderen, weil du jedes Mal die gleiche ID "box" vergeben hast, was bei Ausgabe von mehreren Datensätzen dann bedeutet, dass mehrere Elemente diese gleiche ID haben.
    Beides nicht erlaubt, und ein Fehler. Also das erst mal beheben.

    MfG ChrisB

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/