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

Beitrag lesen

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.

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