Michael: Teile von html dateien einbinden

Hallo Zusammen

Ich habe nun schon etwa sechs Stunden versucht, eine php Datei zu erstellen. Aber gelungen ists mir nicht.

Also, von vorne weg:

Einige von Euch kennen vielleicht das Online Billard Spiel auf www.flyordie.com . Dort wird mit einem sogenannten Rating-System gearbeitet, ähnlich wie bei der Tennis Weltrangliste; Verliert man ein Spiel, verliert man auch Punkte. Nun gibt es aber leider keine Topliste der Spieler (lediglich eine Top 20). Ich würde jetzt gerne aber eine Top 100 oder so erstellen. Jeder Spieler, hat eine eigene Player Information - Seite auf der man das Rating einsehen kann. Unter folgendem Link findet Ihr eine solche Seite.

http://www.flyordie.com/servlet/s/playerInfo.html?portal=real_com&lang=en&room=1040&nick=a3VyaWVy

Nun möchte ich aus dieser HTML Seite das Rating, also eine blosse Zahl in eine php Datei einbinden. Nur ist die Frage wie. Auf dieser php Datei sollten dann einige ratings von Spielern aufgelistet sein, wo ich dann eine Topliste erstellen kann.

Nur weiss ich leider nicht wie ich die Zahl in die php Datei einbinden kann. Ich habe nun schon einige Sachen ausprobiert, auch "include" habe ich versucht einzusetzen aber es hat nicht funktioniert.

Könnt Ihr mir weiter helfen?

Danke schon zum Voraus und nette Grüsse
Michael

  1. Nach Möglichkeit würde ich es in eine Datenbamk schreiben und von dort auslesen.

  2. Hallo Michael,

    Also, von vorne weg:

    Bist Du Dir sicher das Dir auf Deinem gehosteten Server PHP zur Verfügung steht? Ist vielleicht eine blöde Frage, aber evt. ist Dir nicht bewusst das PHP nicht zwangsläufig verfügbar sein muss? :-)
    Teste es einfach mal aus, erstelle eine Datei namens phpinfo.php oder so. Schreibe in diese Datei einfach nur:

    <?php

    phpinfo();

    ?>

    Kopiere diese Datei ins Root Deines Webspaces und rufe die Datei über Deinen Browser auf (http://deine-url-adresse.ch/phpinfo.php)
    Falls PHP auf dem Server verfügbar ist, wird Dir nun eine Statusseite
    von PHP erstellt, falls nicht kommt entweder ein Fehler oder es wird halt der Inhalt als Text ausgegeben.

    Teste das mal vorab und melde Dich wieder,
    Grüsse AndreD

  3. Hallo,

    Vorweg: Dein Vorhaben braucht IMHO das Einverstaendis
    der Leute von flyordie.com.

    http://www.flyordie.com/servlet/s/playerInfo.html?portal=real_com&lang=en&room=1040&nick=a3VyaWVy
    Nun möchte ich aus dieser HTML Seite das Rating, also eine blosse Zahl in eine php Datei einbinden.

    Du meinst vermutlich die Zahl 97 aus folgendem Quelltext:
    <!-- Anfang der HTML-Datei -->
    <tr align=center>
          <td class=n1><span CLASS="normal"><b>Overall</b></span></td>
          <td class=n1><span CLASS="normal">97</span></td>
          <!-- u.s.w. -->
         </tr>
    <!-- Rest der HTML-Datei -->

    Du kannst
    (1) den Inhalt der Datei in eine String-Variable einlesen und dann
    (2) mit geeigneten String-Funktionen diese Zahl isolieren.

    zu (1): Das geht z.B. mit file_get_contents() oder fopen() - sofern
    die Konfigurationsvariable allow_url_fopen auf "1" gesetzt ist.
    Das geht vermutlich auch im Skript selbst (PHP_INI_ALL)
    mit ini_set().

    http://www.php.net/manual/de/function.file-get-contents.php
    http://www.php.net/manual/de/function.fopen.php
    http://www.dclp-faq.de/q/q-datei-lesen.html
    http://www.php.net/manual/de/ref.filesystem.php
    http://www.php.net/manual/de/function.ini-set.php

    Falls das nicht klappt, koenntest Du einen Weg mit fsockopen()
    u.s.w. versuchen. Ist aber etwas komplizierter.

    Zu (2):
    Man koennte z.B. mit strstr() den Reststring ab dem
    Wort "Overall" nehmen, davon den Reststring ab
    "normal" und davon alles zwischen der ersten >
    und der ersten <.
    PHP-Manual: String-Funktionen:
    http://www.php.net/manual/de/ref.strings.php
    http://www.php.net/manual/de/function.strstr.php
    http://www.php.net/manual/de/function.strpos.php
    http://www.php.net/manual/de/function.substr.php
    Am Schluss konvertierst Du mit der Funktion intval()
    den String "97" in die Zahl 97.
    http://www.php.net/manual/de/function.intval.php

    Gruesse,

    Thomas

    1. Du kannst
      (1) den Inhalt der Datei in eine String-Variable einlesen und dann
      (2) mit geeigneten String-Funktionen diese Zahl isolieren.

      zu (1): Das geht z.B. mit file_get_contents() oder fopen() - sofern
      die Konfigurationsvariable allow_url_fopen auf "1" gesetzt ist.
      Das geht vermutlich auch im Skript selbst (PHP_INI_ALL)
      mit ini_set().

      http://www.php.net/manual/de/function.file-get-contents.php
      http://www.php.net/manual/de/function.fopen.php
      http://www.dclp-faq.de/q/q-datei-lesen.html
      http://www.php.net/manual/de/ref.filesystem.php
      http://www.php.net/manual/de/function.ini-set.php

      Falls das nicht klappt, koenntest Du einen Weg mit fsockopen()
      u.s.w. versuchen. Ist aber etwas komplizierter.

      Zu (2):
      Man koennte z.B. mit strstr() den Reststring ab dem
      Wort "Overall" nehmen, davon den Reststring ab
      "normal" und davon alles zwischen der ersten >
      und der ersten <.
      PHP-Manual: String-Funktionen:
      http://www.php.net/manual/de/ref.strings.php
      http://www.php.net/manual/de/function.strstr.php
      http://www.php.net/manual/de/function.strpos.php
      http://www.php.net/manual/de/function.substr.php
      Am Schluss konvertierst Du mit der Funktion intval()
      den String "97" in die Zahl 97.
      http://www.php.net/manual/de/function.intval.php

      Gruesse,

      Thomas

      Hallo Thomas

      Ich habe nun versucht das ganze zu erstellen, habe es aber leider nicht geschafft. Ich würde mich freuen, wenn Du mir den gesamten Quelltext so aufschreiben könntest, wie er in der PHP datei(en) vorkommen muss, damit es klappt. Sonst schaff ich das nicht, aber wenn dus aufschreibts, kann ichs so lernen!

      Gruss Michael

      1. Hallo Michael,

        Zuerst mal:  Bitte keine sinnlosen Vollquotings. </faq/#Q-09a>. Danke.

        Ich würde mich freuen, wenn Du mir den gesamten Quelltext so aufschreiben könntest, [...] Sonst schaff ich das nicht, aber wenn dus aufschreibts, kann ichs so lernen!

        Das hier ist das SELF-Forum. Nicht das GET-Forum.
        Mein Motto (und wohl das der meisten Regulars) ist: Hilfe zur Selbsthilfe.
        Lies dazu auch </faq/#Q-07a>

        Komplett-Loesungen auf dem Silbertablett gibt's von mir nur
        1. bei Vollmond (wenn gleichzeitig der Saturn in meinem Sternzeichen steht)
        2. gegen Geld.
        3. wenn ich sonst einen ausserordentlichen Grund dafuer sehe.
        Momentan ist keine der Bedingungen 1 - 3 gegeben.

        Ich habe Dir alle relevanten Links gegeben.
        Fang an, probiere aus.
        Schritt fuer Schritt.
        Versuch nicht alles auf einmal.

        Schau zuerst mal, ob Du das Einlesen der fremden Datei hinkriegst.
        In einem zweiten Schritt widmest Du Dich dann dem String.

        Wenn es bei einem Schritt Probleme gibt, lies nochmal gut nach
        im Manual (eventuell in der englischen Version, die ist aktueller)
        und in der http://www.dclp-faq.de/
        Wenn Du dann immer noch nicht klarkommst, poste den relevanten
        Quellcode und die Fehlermeldungen (</faq/#Q-07b> ff.) hier, und
        wir helfen Dir gerne weiter.

        Gruesse,

        Thomas

        1. Hallo Thomas

          Also wegen  /faq/#Q-09a . Sorry, habe ich nicht gelesen, werde ich in Zukunft vermeiden.

          Und zum anderen:

          Fang an, probiere aus.
          Schritt fuer Schritt.

          Das habe ich gestern etwa 6 Stunden von 20 bis 2 Uhr und heute wieder 2 Stunden. Also am selbst testen und versuchen fehlts ja bestimmt nicht.

          Aber ich versuchs weiter.

          Also teil 1 deiner Schilderung habe ich ausgeführt und es klappt, zwar mit einer Fehlermeldung
          (Warning: main(): stream does not support seeking in /home/snooker-/public_html/rangliste/fehler.php on line 13
          )
          aber der Pfad ist eingebunden. So sieht das Script jetzt aus: (ist ein anderes als bei Deiner Ausführung, da ich dort kein Resultat erzielte)

          <!-- saved from url=(0022)http://internet.e-mail -->
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

          <html>
          <head>
          </head>

          <body>

          <?php
          include("http://www.flyordie.com/servlet/s/playerInfo.html?portal=real_com&lang=en&room=1040&nick=a3VyaWVy".$HTTP_GET_VARS["url"]);
          ?>

          </body>
          </html>

          Jetzt die Frage, wo muss ich mit Teil 2 weitermachen. In der selben php datei, wo das obige Script eingesetzt ist, oder muss ich eine neue Datei erstellen, die sich die angaben aus der obigen hinaus nimmt?

          Gruss Michael

          1. Hallo,

            Das habe ich gestern etwa 6 Stunden von 20 bis 2 Uhr und heute wieder 2 Stunden. Also am selbst testen und versuchen fehlts ja bestimmt nicht.

            OK, OK. Ich glaub Dir ja, dass Du Dir Muehe gibst.

            include("http://www.flyordie.com/servlet/s/playerInfo.html?portal=real_com&lang=en&room=1040&nick=a3VyaWVy".$HTTP_GET_VARS["url"]);

            Das solltest Du auf keinen Fall tun.
            Ich habe _nie_ gesagt, dass Du include() verwenden sollst.
            1. include() ist nicht geeignet, um den Inhalt einer
               externen Datei in einen String einzulesen.
            2. obiges ist ein riesen Sicherheitsloch.
                Du bindest wildfremden Quellcode ein und laesst ihn
                auf Deinem Server ausfuehren. Das ist "lebensgefaehrlich".

            Was das $_GET["url"] am Ende der URL noch soll, ist mir schleierhaft.

            Jetzt die Frage, wo muss ich mit Teil 2 weitermachen. In der selben php datei, wo das obige Script eingesetzt ist, oder muss ich eine neue Datei erstellen, die sich die angaben aus der obigen hinaus nimmt?

            Alles muss in ein und demselben Skript passieren.

            Das Ziel ist ja offenbar eine Rangliste.
            Also musst Du zuerst mal alle Namen/IDs haben.
            Wie Du an die rankommen willst, hast Du uns
            uebrigens auch noch nicht verraten.
            Vermutlich nach dem gleichen Schema:
            a) Fremde Seite in einen String einlesen.
            b) Diesen String analysieren.
            Die Namen kommen dann z.B. in ein Array.
            Dann durchlaeufst Du eine Schleife.
            Mit jeden Namen tust Du folgendes:
              {
               1. Passende Seite auf dem fremden Server abrufen.
                   HTML-Quelltext, den die Seite zurueckgibt, in einen String schreiben.
               2. String analysieren und Punktzahl fuer den Spieler ermitteln.
               3. Punktzahl dem Spieler zuordnen (weiteres Array oder so)
              }
            Nun musst Du noch die Namen nach Punktzahl sortieren,
            und das ganze als HTML-Liste/Tabelle zurueckgeben.

            Dein ganzes Vorhaben ist also ziemlich komplex,
            und das Skript wird voraussichtlich sehr langsam
            sein, weil es ja sehr viele Daten ueber HTTP
            beim fremden Server abholen muss.

            Vielleicht sogar zu langsam.
            Wenn es laenger als 30 Sekunden braucht,
            wird es normalerweise "sterben", es sei denn,
            Du setzt die Lebenszeit hinauf mit
            ini_set("max_execution_time","300")
            oder so, je nachdem, was Du den Besuchern
            zumuten willst...

            Natuerlich waere es einfacher, bequemer und
            IMHO auch sinnvoller, wenn der Webpublisher
            der fremden Seite die Liste selbst herstellen wuerde,
            denn er hat unmittelbaren Zugriff auf die Daten,
            wahrscheinlich sogar auf dem gleichen Server.

            Wenn Du aber das ganze Gebastel von A - Z durchziehst,
            dann hast Du eine Menge ueber PHP gelernt.

            Also noch einmal: Ich glaube, Du hast noch nichtmal
            Schritt 1 geloest, naemlich das Einlesen einer fremden
            HTML-Seite in einen String.

            Fuer einmal mache ich eine Ausnahme und
            liefere Dir eine Silbertablett-Loesung, die ich
            auch getestet habe:

            /* Um sicher zu sein, dass fremde URLs erlaubt sind: */
            ini_set("allow_url_fopen","1");
            print("<p>Konfigurations-Variable allow_url_fopen ist auf [".ini_get("allow_url_fopen")."]</p>\n");

            /* URL der fremden Seite definieren: */
            $fremdurl="http://www.tiptom.ch/tests/html/ultra401.html";
            $fremdurlhtml=htmlspecialchars($fremdurl); /* zwecks Ausgabe in HTML-Quelltext: & -> & u.s.w.*/

            /* Einlesen der fremden Seite in eine String-Variable: */
            $fremdhtml=file_get_contents($fremdurl);

            /* Pruefen, ob es erfolgreich war: */
            if ($fremdhtml==FALSE)
              print("<p><b>Fehler:</b> Das Einlesen der fremden Seite (<a href='$fremdurlhtml'>$fremdurlhtml</a>) war nicht erfolgreich!</p>");
            else
              {
               print("<p><b>Erfolg!</b> Das Einlesen der fremden Seite (<a href='$fremdurlhtml'>$fremdurlhtml</a>) war erfolgreich!</p>");
               print("<p>Die fremde Seite enthaelt ".strlen($fremdhtml)." Zeichen.</p>\n");
               print("<p>Es folgt der Inhalt der fremden Seite:</p>\n");
               print("<hr>\n");
               print(nl2br(htmlspecialchars($fremdhtml)));
               print("<hr>\n");
              }

            So. Nachdem Du Dich von der Harmlosigkeit meiner winzigen Seite
            http://www.tiptom.ch/tests/html/ultra401.html
            ueberzeugt hast, kannst Du das Skript ja mal auf Deinem Server
            laufen lassen.

            Es funktioniert uebrigens auch mit Deiner URL, d.h. wenn Du
            die Variable $fremdurl wie folgt definierst:
            $fremdurl="http://www.flyordie.com/servlet/s/playerInfo.html?portal=real_com&lang=en&room=1040&nick=a3VyaWVy";

            Der Rest - Schritt 2, das Extrahieren der "interessanten" Zahl - ist
            eine Kleinigkeit mit den praktischen String-Funktionen von PHP:
            (eine von 1000 Moeglichkeiten - die erste, die mir einfiel...)

            $vorgaenger1="<b>Overall";
               $reststring=strstr($fremdhtml,$vorgaenger1);
               print("<p>Es folgt der erste Reststring:</p>\n");
               print(nl2br(htmlspecialchars($reststring)));
               print("<hr>\n");

            $vorgaenger2=""normal">";
               $v2laenge=strlen($vorgaenger2);
               $reststring=strstr($reststring,$vorgaenger2);
               print("<p>Es folgt der zweite Reststring:</p>\n");
               print(nl2br(htmlspecialchars($reststring)));
               print("<hr>\n");

            $zahlstring=substr($reststring,$v2laenge,strpos($reststring,"<")-$v2laenge);
               $zahl=intval($zahlstring);
               print("<p>Die Zahl als String: [$zahlstring] und als Zahl: [$zahl]</p>\n");
               print("<hr>\n");

            (Alle print-Ausgaben dienen hier nur Deiner Information
            und "Belehrung" ueber die Auswirkung der Funktionen.
            Spaeter kannst Du sie loeschen oder - besser - auskommentieren.)

            Natuerlich funktioniert das alles nur, solange
            der HTML-Code und der Aufbau der Seiten
            bei flyordie.com unveraendert bleiben.

            Es steht also auf sehr, sehr wackeligen Fuessen.

            Gruesse,

            Thomas

            1. Hallo Thomas

              Tausend Dank für Deine Gesamt Lösung. Freut mich riesig!!!

              Wie Du an die rankommen willst, hast Du uns
              uebrigens auch noch nicht verraten.

              Ich werde die Liste nach und nach vergössern und die Spieler eintragen, die ich im Spiel sehe. Was die Veröffentlichung angeht, werde ich es nur wenigen zugänglich machen. Das heisst also, es ist eher eine private Seite.

              Natuerlich waere es einfacher, bequemer und
              IMHO auch sinnvoller, wenn der Webpublisher
              der fremden Seite die Liste selbst herstellen wuerde,
              denn er hat unmittelbaren Zugriff auf die Daten,
              wahrscheinlich sogar auf dem gleichen Server.

              Natürlich wäre dies einfacher. Aber er scheint dies nicht für nötig zu halten, da vielleicht auch nicht so eine grosse Nachfrage ist.

              Gruss Michael

              1. Hallo,

                Tausend Dank für Deine Gesamt Lösung. Freut mich riesig!!!

                Gerngeschehen.

                War fuer mich ein guter Anlass, mal selbst
                file_get_contents() auszuprobieren, statt
                es immer nur weiterzuempfehlen ;-)

                Wie Du an die [Benutzer-IDs] rankommen willst, hast Du uns
                uebrigens auch noch nicht verraten.

                Ich werde die Liste nach und nach vergössern und die Spieler eintragen, die ich im Spiel sehe.

                Achso.
                Im ersten Posting war noch von einer "Top 100" Liste die Rede.
                Dafuer haettest Du ja saemtliche Teilnehmer durchlaufen
                muessen, um dann die Rangliste zu erstellen.

                Jetzt laeuft es offenbar eher auf eine "Liste meiner Spielpartner"
                heraus. Auch gut.

                Auf jeden Fall empfehle ich Dir, aus meinem Code eine Funktion
                zu machen, welche die ID (Nickname) des Teilnehmers als
                Parameter erwartet und die Ranking-Zahl als Zahl zurueckgibt,
                also so etwas (ungetestet!):

                function rankingzahl($nickname)
                {
                 $fremdurl="http://www.flyordie.com/...&nick=" . $nickname;
                 /* u.s.w. */
                 $zahl=intval($zahlstring);
                 return $zahl;
                }

                Die Nicknames solltest Du in einen Array schreiben.
                Damit ist es sehr einfach, neue Nicknames hinzuzufuegen
                oder veraltete Nicknames zu loeschen.

                $nickliste = array("DeinNick", "a3VyaWVy", "Partner2Nick");

                Diesen Array kannst Du dann z.B. mit foreach() durchlaufen.

                In der Schleife ermittelst Du mit der obigen Funktion
                rankingzahl() die Ranking-Zahl zu jedem Nickname.

                Somit kannst Du einen Array mit den Ranking-Zahlen
                fuellen. Dann hast Du z.B. sowas:
                $rank["DeinNick"]=152;
                $rank["a3VyaWVy"]=95;
                $rank["Partner2Nick"]=123;

                Dann noch sortieren und der Reihe nach ausgeben.

                Diesen Teil ueberlasse ich Dir. ;-)

                http://www.php.net/manual/de/language.types.array.php
                http://www.php.net/manual/de/ref.array.php
                http://www.php.net/manual/de/control-structures.foreach.php
                http://www.php.net/manual/de/function.asort.php

                Gruesse,

                Thomas

                1. Hallo Thomas

                  Ich bin nun schon wieder am testen und probieren, nur leider klappts nicht. Ich komme über den von Dir gezeigten Schritt einfach nicht hinaus. Es gibt einfach Sachen, die man irgendwie nicht kapiert, php scheint für mich sowas zu sein. Vielleicht kapier ichs irgendwann, aber ich wäre um eine kleine Hilfe nochmals sehr froh. (Ich weiss, ich bin einer von den ganz Langsam - Kapierenden ;-) )

                  Gruss Michael

  4. Hallo Zusammen und erst mal Danke für Eure Hilfe

    »» http://www.flyordie.com/servlet/s/playerInfo.html?
    portal=real_com&lang=en&room=1040&nick=a3VyaWVy
    »» Nun möchte ich aus dieser HTML Seite das Rating, also eine
    blosse Zahl in eine php Datei einbinden.

    Du meinst vermutlich die Zahl 97 aus folgendem Quelltext:
    <!-- Anfang der HTML-Datei -->
    <tr align=center>
           <td class=n1><span CLASS="normal"><b>Overall</b></span></td>
           <td class=n1><span CLASS="normal">97</span></td>
           <!-- u.s.w. -->
          </tr>
    <!-- Rest der HTML-Datei -->

    Genau das habe ich gemeint. Ich werde das mal versuchen, was Thomas geraten hat.

    Also, mein Server verwendet PHP (Version 4.3.4).
    PHP ist also kein Problem als Verwendung. Ich werde mich mal mit den Tipps von Thomas Leuthi auseinander setzen und sehen ob ich das schaffe. Wäre aber auch auf andere Vorschläge noch dankbar.

    Noch was zu dem was Thomas Luethi gesagt hatte wegen der Erlaubnis von Flyordie:
    Ich habe einen dortigen Moderator gefragt, und er hat gesagt es sei kein Problem.

    Gruss Michael