Stichwörter in Links umwandeln lassen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Stichwörter in Links umwandeln lassen

    Hallo,

    folgendes zum Hintergrund: ich entwickle im Moment eine Site zu Computerspielen. Dort werden Spiele getestet und bewertet. Realisiert wird das Ganze mit HTML, PHP und einer MySQL Datenbank.

    Ich habe nun eine Idee, von der ich weder weiß, ob sie sich umsetzen läßt, noch wie das geschehen könnte (bin leider ein Anfänger in der Beziehung).

    Grob gesagt sieht die Haupttabelle so aus:

    Code:
    ID      TITEL             TEXT (zum Spiel)
    1       Starcraft        Ein ganz normaler Blindtext.
    2       Diablo 2         Ein ganz normaler Blindtext.
    3       Warcraft 3     Ein ganz normaler Blindtext.
    Aufgerufen wird ein Test dementsprechend so: "test.php?id=1" (2,3 u.s.w.)

    Nun zu meiner Idee: wenn innerhalb eines Test-Textes ein Titel auftaucht, der bereits getestet wurde, dann soll dieser mit einem Link und der entsprechenden ID hinterlegt werden.

    Beispiele: Im Warcraft 3 Test erscheint das Wort Starcraft. Das Spiel wurde schon getestet und ist dementsprechend bei den Titeln in der Datenbank hinterlegt. Nun schaut sich PHP die Datenbank an, findet den Titel und die entsprechende ID dazu und macht daraus den gewünschten Link.

    Leider ist das nur meine Theorie, da ich nicht weiß, wie das tatsächlich funktioniert und ob das überhaupt funktionieren könnte - auch in Bezug auf die Performance der Datenbank, die, sollte jedes Wort eines langes Test's überprüft werden müssen, ja ziemlich zu kämpfen hätte.

    Ich danke jedenfalls schon mal für Tipps und etwaige Hinweise.

    Pat
    EDIT:
    habs mal nach brainstorming verschoben
    wurzel

    Zuletzt geändert von Wurzel; 23.01.2004, 20:59.

  • #2
    imho sinnvoller wäre es, zu jedem text eine stichwortliste zu hinterlegen (bei der eingabe), dann kannst du mit 2 abfragen deine notwendigen ids sammeln:
    1. abfrage auf den inhalt
    2. abfrage auf die tests und als basis das stichwort/die stichwörter verwenden

    vor der ausgabe ersetzt du dann das stichwort im text mit dem link
    Kissolino.com

    Kommentar


    • #3
      Letzendlich müsstest du erst einmal alle Spiele aus der Datenbank auslesen und dann den Text durchsuchen lassen.

      PHP-Code:
      $result mysql_query('SELECT id, titel FROM tabelle');
      $spiele = array();

      $text '...'// Text der überprüft werden soll
      $link '<a href="test.php?id=%s">%s</a>'// Linkmuster

      while ($row mysql_fetch_assoc($result)) {
         
      $text str_replace($row['title'], sprintf($link$row['id'], $row['title']), $text);

      Dieses Verfahren würde jedoch darauf hinausführen, dass alle Spiele ausgelesen werden müssen. Bei einer Große Menge ist dies für die Performance nicht förderlich. Vielleicht wäre es da besser, Spiele in Kategorien einzuordnen und dann nur nach Spielen zu suchen, die in den gleichen Kategorien wie sind.
      Desweiteren würde ich den Text nur einmal ersetzen lassen und dann irgendwo cachen. So muss er nicht jedes Mal ersetzt werden, wenn die Datei angeschaut wird.

      Kommentar


      • #4
        Hallo ihr zwei!

        Erst einmal danke für die rasche Hilfe. Beide Postings haben mir in der Sache ein großes Stück weitergeholfen.

        Im Großen und Ganzen ist meine derzeitige Lösung eine Kombination aus beiden Varianten. Der Code von webstar85 hat fast einwandfrei funktioniert. Die Kategorien habe ich nicht benötigt, da ich den Tipp von Wurzel, nämlich Stichwörter anzulegen, beherzigt habe.

        In der Praxis heißt das, ich gebe eine Stichwortliste (im Stil von "Diablo,Diablo2, Warcraft") beim Anlegen des Tests an. Diese wird beim Aufrufen des Tests mit den Datenbankeinträgen verglichen. Sollte eines dieser Stichwörter bereits als Test existieren, wird der Link umgewandelt, der dorthin führt - ansonsten passiert nichts. Genauso soll es sein.

        Ein Problem tut sich mir allerdings noch auf und das wäre folgendes:

        Angenommen, ich hab einen Test, in dem die Begriffe Diablo und Diablo 2 vorkommen. Beide Spiele existieren mit einem Test in der Datenbank und beide Spiele habe ich dementsprechend auch in der Stichwortliste eingegeben.

        Resultat: es wird nur Diablo verlinkt, nicht jedoch Diablo 2.

        Lösch ich nun "Diablo" als Stichwort aus der DB, wird Diablo 2 dann doch wieder verlinkt. Nur wenn beide existieren, klappt es nicht. Die Reihenfolge in der Stichwortliste (also "diablo,diablo2" oder "diablo 2,diablo") habe ich auch bereits verändert, aber das bringt nichts.

        Ich vermute, dass die str_replace Parameter irgendwie optimiert werden müssten, aber als Laie bin ich da ehrlich gesagt überfragt.

        Oder es liegt an etwas anderem. Vielleicht sollte ich noch etwas genauer darauf eingehen, wie ich das realisiert habe:

        Das Datenbank-Feld, in dem die Stichwortliste steht, ist ein varchar-Datentyp - die Wörter sind wie bereits gesagt mit Komma getrennt. In der Ausgabe lasse ich das Datenbank-Feld auslesen und explode die einzelnen Begriffe in ein Array. Danach wird das Array in einer foreach-Schleife ausgelesen und der Text in jedem Schleifendurchgang verändert. Am Ende wird dann der komplett fertige Text ausgegeben.

        Der Code sieht also ungefähr so aus.

        PHP-Code:

        $link 
        '<a href="test.php?id=%s">%s</a>'// Linkmuster

        $pieces explode (","$row_fragment[3]); // $row_fragment[3] ist das Stichwort-Feld

        foreach ($pieces as $wert) {

        $result mysql_query("SELECT id, name FROM testumgebung WHERE name=\"$wert\"");
        $row mysql_fetch_assoc($result);
         
        $text str_replace($row['name'], sprintf($link$row['id'], $row['name']), $text);
        }

        echo 
        $text
        Wie gesagt, das System funktioniert soweit, nur ergibt sich halt das oben erwähnte Problem.

        Für Hilfe wäre ich dankbar,

        Pat

        Kommentar


        • #5
          das ist etwas tricky ... wenn du in deinen quelltext schaust, siehst du, dass
          deine <a hrefs> verschachtelt sind, weil diablo mehrfach vorkommt und
          somit auch mehrfach bearbeitet wird. eine möglichkeit ist mit "eindeutigen"
          hilfsvariablen zu arbeiten:
          PHP-Code:
          <?php
          $text 
          "hier steht diablo und später diablo2 aber auch diablo 2 soll ersetzt werden";
          $pieces = array("diablo 2""diablo2",  "diablo");
          $row['id'] = 1;
          $link '<a href="test.php?id=%s">%s</a>'// Linkmuster
          $z count($pieces);

          // erst mal alle diablos markieren und entfernen
          for($i=0;$i<$z;$i++)
          {
                  
          $text str_replace($pieces[$i], '#'.$i$text);
          }

          // markierungen durch diablos ersetzen
          for($i=0;$i<$z;$i++)
          {

                  
          $text str_replace('#'.$i,sprintf($link$row['id'], $pieces[$i]), $text);
          }
          echo 
          $text;
          ?>
          geht vielleicht auch eleganter ...
          Kissolino.com

          Kommentar


          • #6
            Hallo,

            danke erstmal für die Antwort.

            Hab jetzt mal mit deiner Lösung ein bisschen rumgespielt, so dass $row[id] nun auch die gewünschte dynamische Wertzuweisung bekommt. Und hab mich auch schon riesig gefreut, denn das Diablo / Diablo 2 Problem hat sich tatsächlich in Luft aufgelöst!

            Die Freude währte allerdings nicht allzulange - leider hat sich nun ein Fehler eingeschlichen, den es vorher nicht gab.

            Wie ich in meinem vorherigen Postings erwähnte:

            Sollte eines dieser Stichwörter bereits als Test existieren, wird der Link umgewandelt, der dorthin führt - ansonsten passiert nichts. Genauso soll es sein.

            Genau das Fettgedruckte ist nun nicht mehr der Fall. Es wird jetzt ein Link gesetzt, wenn das Wort in der Stichwortliste erscheint - egal, ob es den Test gibt oder nicht.

            Beispiel: in einem Test kommt das Wort "Warcraft" vor. Es gibt zwar noch keinen Test zu "Wacraft", aber ich nehme es vorsorglich schon mal in die Stichwortliste rein, denn so ein Test kann ja irgendwann mal dazukommen. In der alten Version wäre nun nichts passiert und sobald der "Warcraft" Test in der Datenbank gewesen wäre, wäre der Link entstanden. In der jetzigen Version wird sofort ein Link gesetzt, nur halt ohne ID am Ende.

            Das ist natürlich unerwünscht, denn die Seite wäre leer

            Weiß du oder jemand anderes, was man dahingend machen könnte?

            Danke,

            Pat

            Kommentar


            • #7
              Original geschrieben von Wurzel
              2. abfrage auf die tests und als basis das stichwort/die stichwörter verwenden
              ein einfaches if(in_array(stichwort,abfrageliste)) sollte abhilfe schaffen
              Kissolino.com

              Kommentar

              Lädt...
              X