Phil: | MySQL Seiteninterne Suchmaschine - aber wie?

Hi!
Ich habe bei mir z.Z. eine Suchmaschine laufen, die durchsucht eine bestimmte Spalte nach einem Begriff:
SELECT * FROM tabelle WHERE wort LIKE '$_POST[wort]'

Problem: Gibt man 2 Wörter ein, so kommt kein Ergebnis raus. Ist ja auch ganz klar.
aber wie umgehe ich das? Wie kann ich auch 2 Begriffe eingeben und trotzdem funktioniert die Suche...

am liebsten wär mir ein tutorial, wo das für DAUs erklärt wird...
Und bitte keine Links zu google oder hotscripts oder andere Seiten.
Ich habe gegooglet und ich will selbst schreiben, nicht runterladen und fertig...

Danke für die Hilfe nu schon
CU
http://www.yubb.de

  1. Hi!

    Ich habe bei mir z.Z. eine Suchmaschine laufen, die durchsucht eine bestimmte Spalte nach einem Begriff:
    SELECT * FROM tabelle WHERE wort LIKE '$_POST[wort]'

    Problem: Gibt man 2 Wörter ein, so kommt kein Ergebnis raus. Ist ja auch ganz klar.
    aber wie umgehe ich das? Wie kann ich auch 2 Begriffe eingeben und trotzdem funktioniert die Suche...

    am liebsten wär mir ein tutorial, wo das für DAUs erklärt wird...
    Und bitte keine Links zu google oder hotscripts oder andere Seiten.
    Ich habe gegooglet und ich will selbst schreiben, nicht runterladen und fertig...

    SPLITte doch die Anfrage:

    $suchtext = 'web internet';
    @suchtext = split (/\ /,$suchtext);

    jetzt baust Du mit foreach... einfach Deinen select zusammen.

    $suche = "where 1";

    foreach $i (@suchtext)
      {
        $suche = $suche . " and SUCHEFELD = '".$i."'";
      }

    und dann:

    $sql = "select from IRGENDWAS" . $suche;

    usw.

  2. Hallo Phil,

    am liebsten wär mir ein tutorial, wo das für DAUs erklärt wird...

    Kannst Du haben:

    http://www.mysql.com/doc/en/Fulltext_Search.html

    Grüße,

    Christian

    1. Hallo,

      am liebsten wär mir ein tutorial, wo das für DAUs erklärt wird...

      Kannst Du haben:

      http://www.mysql.com/doc/en/Fulltext_Search.html

      das "MATCH (x,y) AGAINST ('$suche' IN BOOLEAN MODE)" kannte ich noch nicht.
      Das wäre ja die Lösung. Aber leider erst ab MySQL Version 4.

      Wäre mal zu überlegen, "aufzurüsten"....

  3. Hi,

    Problem: Gibt man 2 Wörter ein, so kommt kein Ergebnis
    raus. Ist ja auch ganz klar.

    mir nicht. Welche Semantik möchtest Du denn dieser Eingabe zugeordnet wissen? Entsprechend kannst Du Deine WHERE-Klausel generieren - da kann SQL relativ viel.

    aber wie umgehe ich das? Wie kann ich auch 2
    Begriffe eingeben und trotzdem funktioniert die
    Suche...

    Definiere "funktioniert".
    Meinst Du ein AND, ein OR, eine Phrasensuche, ... ?

    Viele Grüße
          Michael

    1. Hi!
      Ob mit AND und OR, oder mit + und -, ob mit "...", alles recht egal, hauptsache, ich kann nach mehreren Begriffen suchen :)
      CU
      http://www.yubb.de

      1. Hi,

        Ob mit AND und OR, oder mit + und -, ob mit "...",
        alles recht egal, hauptsache, ich kann nach mehreren
        Begriffen suchen :)

        nein! Das ist eben _nicht_ egal.

        Wie willst Du denn entscheiden, ob die Suche funktioniert, wenn _Du_ nicht spezifiziert hast, was der Begriff "funktionieren" überhaupt bedeuten soll?

        Es ist _Deine_ Entscheidung, ob die Eingabe von zwei Worten als AND, als OR, als Phrase oder als was auch immer zu verstehen sein _soll_ - und ob möglicherweise mehrere verschiedene Arten von Eingaben (mit entsprechenden Operatoren, um nur mal ein Beispiel zu nennen) mehrere der angegebenen Bedeutungen abdecken können soll. Aber jede Eingabe muß ein _definiertes_ Verhalten bewirken - genau diese Definition ist Dein Job, und zwar der wichtigste überhaupt beim gesamten Entwurf.

        Erst _nachdem_ Du das festgelegt hast, kannst Du damit _anfangen_, eine entsprechende Lösung zu realisieren - also eine WHERE-Klausel, welche der Aufgabenstellung entspricht, aus der Eingabe dynamisch zu erzeugen.
        Das ist dann gar nicht mehr arg schwer - aber ohne eine Aufgabenstellung wirst Du der Lösung _dieser_ Aufgabenstellung keinen Schritt näher kommen.

        Viele Grüße
              Michael

        1. Hallo, Michael.

          Ob mit AND und OR, oder mit + und -, ob mit "...",
          alles recht egal, hauptsache, ich kann nach mehreren
          Begriffen suchen :)

          Erst _nachdem_ Du das festgelegt hast, kannst Du damit _anfangen_, eine entsprechende Lösung zu realisieren

          IMHO denkt man nach einiger Zeit genug strukturiert, dass man bei kleinen Programmen (wie in diesem Fall) die Vorüberlegungen schon in einem Arbeitsgang mit dem Schreiben des Codes erledigt. Man hat meist schon automatisch ein Flussdiagramm im Kopf, man stellt sich die verschiedenen Eingaben und die Reaktionen des Programms darauf vor und dividiert dementsprechend die Teilbereiche des Programmes in Funktionen auseinander bzw. legt die Abläufe fest.
          Ich habe vor einer Woche genau das realisiert, was Phil gerade plant. Mit dem Markup für das Eingabeformular, welches eine Suche nach zwei Kriterien zulässt (zusätzlich kann der Benutzer UND oder ODER wählen), dem Markup für die Ausgabe der Suchresultate und der Fehlerbehandlung aller Eventualitäten umfasst das Skript 148 Zeilen und ist nicht einmal sonderlich auf Effizienz optimiert.

          Hättest du mir geraten, mir erst einmal großartig auszudenken und auf Papier zu notieren, was ich überhaupt vorhabe, bevor ich auch nur die erste Codezeile schreibe, hätte ich deinen Rat wohl nicht befolgt, da es mir zuviel Aufwand für ein solch kleines Programm ist, welches höchstens vierfach bedingt-verschachtelt ist. Ohne die Fehlerbehandlung würde das Formular, eine Schleife, welche die Query konstruiert, und eine Ausgabe ausreichend, ohne Markup sind das 40-50 Zeilen; und eigentlich ist der einzige "Clou" bzw. Kernpunkt des Programmes, eine entsprechende Datenbankabfrage zu generieren.
          Vielleicht ist es einfach so, dass man bei einem vergleichsweise unkomplizierten Programm sofort in Anweisungen und Kontrollstrukturen denken kann.

          Das ist dann gar nicht mehr arg schwer - aber ohne eine Aufgabenstellung wirst Du der Lösung _dieser_ Aufgabenstellung keinen Schritt näher kommen.

          Genau, es ist nicht schwer.

          Im Falle von Phil ist der Hinweis es gerechtfertigt (es weiß anscheind wirklich nicht, was er will  bzw. denkt nicht in Kategorien der technischen Machbarkeit), es klingt nur ein wenig oberlehrerhaft, auch wenn du vollkommen recht hast. Wenn man das strukturierte Arbeiten einmal gelernt hat und vor allen Dingen weiß, *wie* man ein im Kopf ausgedachtes Programmschema in strukturiertem Code realisiert, kann man sich manche Vorüberlegungen sparen bzw. man erledigt sie automatisch, aber die einzelnen Arbeitsphasen sind dann nicht mehr einfach auseinanderdividierbar.

          (Das gilt natürlich nicht, wenn man für andere lesbaren Code schreiben muss - dann zählen die Vorüberlegungen und der Code ist im Endeffekt mehr oder weniger irrelevant, es zählt nur der vom Code abstrahierte Programmablauf, wie du sagst, das ist das Wichtigste und Tatsächliche beim Entwerfen eines Programms - oder das Projekt umfangreicher wird und alles miteinander verzahnt ist.)

          Die von dir genannte Vorgehensweise gehört m.E. zu den Grundlagen beim Erlernen von dem Erstellen von Programmen bzw. generell automatisierten Abläufen.
          Ich wollte nur anmerken, dass man als Fortgeschrittener viele Arbeitsschritte kombiniert.  Vorüberlegungen sind toll, aber damit ein Programm läuft, bedarf es so oder so einer Umsetzung. ;) Vor allem wenn diese Umsetzung keine Herausforderung darstellt, wie es hier der Fall ist, da der eigentliche Programmablauf klar wie Klößchenbrühe ist (ok, ok, "sein sollte" ;)), kann man sich m.E. in diesem Fall problemlos von der traditionellen Arbeitsweise loslösen.

          Ich denke einmal, wenn man professionell Software schreibt, treffen meine Überlegungen nicht zu, aber hey, Phil will "nur" ein kleines Suchskript für seine Seite basteln, das muss nicht perfekt sein, auch wenn es ihm gut täte, exemplarisch daran zu lernen, wie man es bestenfalls macht, da er eines Tages möglicherweise dazu gezwungen wird, so zu arbeiten, da sollte ihm diese Vorgehensweise bekannt sein.

          Jetzt habe ich mich sooft eingeschränkt, dass nichts mehr übrig bleibt, aber wie gesagt, ich hatte nicht die Absicht, dir zu widersprechen.

          Mathias

          1. Hi Mathias,

            Erst _nachdem_ Du das festgelegt hast, kannst Du
            damit _anfangen_, eine entsprechende Lösung zu
            realisieren

            IMHO denkt man nach einiger Zeit genug strukturiert,
            dass man bei kleinen Programmen (wie in diesem Fall)
            die Vorüberlegungen schon in einem Arbeitsgang mit
            dem Schreiben des Codes erledigt.

            Das glaube ich nicht. Dir wird die Spezifikation vielleicht nicht mehr als separater Schritt bewußt - aber sie muß abgeschlossen sein, bevor Du das Ergebnis der Spezifikation implementierst.

            Man hat meist schon automatisch ein Flussdiagramm
            im Kopf, man stellt sich die verschiedenen Eingaben
            und die Reaktionen des Programms darauf vor

            Letzteres _wäre_ diese Spezifikation. Genau die fehlte aber.

            Mit dem Markup für das Eingabeformular, welches eine
            Suche nach zwei Kriterien zulässt (zusätzlich kann
            der Benutzer UND oder ODER wählen),

            Genau. Du hast (implizit) spezifiziert, daß Du die
            Beschreibung, wie die Terme zu interpretieren sind,
             1. dem Benutzer überläßt und
             2. dies in einem separaten GUI-Element durchführst,
            also _nicht_ durch eine spezielle Syntax _innerhalb_ des Eingabefeldes für die Suchbegriffe.
            Genau das ist die Design-Entscheidung, die _vor_ der Umsetzung in HTML-Code gefallen ist.

            Hättest du mir geraten, mir erst einmal großartig
            auszudenken und auf Papier zu notieren, was ich
            überhaupt vorhabe, bevor ich auch nur die erste
            Codezeile schreibe, hätte ich deinen Rat wohl nicht
            befolgt, da es mir zuviel Aufwand für ein solch
            kleines Programm ist,

            Dem kann ich mich nicht anschließen.

            Der vorherige Absatz _ist_ diese Spezifikation.
            (Der Design-Prozeß dauert vielleicht eine Minute.)
            Aber es ist einfach arbeitsmethodisch wichtig, sich der Abgängigkeit der einzelnen Schritte bewußt zu sein.

            Vielleicht ist es einfach so, dass man bei einem
            vergleichsweise unkomplizierten Programm sofort in
            Anweisungen und Kontrollstrukturen denken kann.

            Davor kann ich nur warnen.

            Eine "einklagbare" Aufgabenstellung ist für jeden Implementierungsvorgang eine lohnende Investition.

            Für ein Programm, das nur Du selbst verwenden willst, hast Du diese Aufgabenstellung im Kopf - aber jeder andere Anwender, der jammert, daß Dein Programm "nicht funktioniert", dem wirst Du Deine Aufgabenstellung unter die Nase halten können und sagen: "Es funktio-
            niert innerhalb der definierten Parameter".

            Im Falle von Phil ist der Hinweis es gerechtfertigt
            (es weiß anscheind wirklich nicht, was er will bzw.
            denkt nicht in Kategorien der technischen
            Machbarkeit), es klingt nur ein wenig
            oberlehrerhaft, auch wenn du vollkommen recht hast.

            Der letzte Teilsatz sagt mir zu. ;-)
            Wenn ich dafür die "Cheatah-Krankheit" auf mich nehmen
            muß, dann soll es wohl so sein.

            (Das gilt natürlich nicht, wenn man für andere
            lesbaren Code schreiben muss

            Es reicht schon, wenn andere (Kunden!) Dein Programm
            auch nur _benutzen_ wollen.
            Der Begriff "funktioniert" muß dann eine definierte
            Bedeutung haben - andernfalls ändert der Kunde diese
            Bedeutung so lange, bis Deine Firma pleite ist.

            Die von dir genannte Vorgehensweise gehört m.E. zu
            den Grundlagen beim Erlernen von dem Erstellen von
            Programmen bzw. generell automatisierten Abläufen.

            Eben - und dies zu vermitteln ist mein Beitrag zur
            "Energie des Verstehens" in diesem Portal.

            Ich wollte nur anmerken, dass man als
            Fortgeschrittener viele Arbeitsschritte kombiniert.
            Vorüberlegungen sind toll, aber damit ein Programm
            läuft, bedarf es so oder so einer Umsetzung. ;)

            Aber für die Entscheidung, ob man ein Programm über-
            haupt zu realisieren _versucht_, bedarf es einer
            Vorüberlegung. Diese verhindert, daß man sich an
            Projekten versucht, die bei genauer Betrachtung von
            vorn herein zum Scheitern verurteilt sind.

            Klassisches Beispiel: "Wie schütze ich meine Bilder
            davor, kopiert zu werden?" Möchtest Du das erst aus-
            probieren, oder möchtest Du lieber vorher nachdenken?

            Vor allem wenn diese Umsetzung keine Herausforderung
            darstellt, wie es hier der Fall ist,

            Jetzt tust Du dem Fragesteller aber Unrecht.

            Ob etwas eine Herausforderung darstellt oder nicht,
            das hängt immer von dem aktuellen Kenntnisstand des
            Ausführenden ab. Gerade weil ich ihm in dieser Hin-
            sicht etwas weniger zutraue als Dir, bin ich bei ihm
            detaillierter darauf eingegangen, wo er seinen Arbeits-
            prozeß verbessern sollte - und das betrifft _nicht_
            den Programmier-Skill.

            Ich denke einmal, wenn man professionell Software
            schreibt, treffen meine Überlegungen nicht zu, aber
            hey, Phil will "nur" ein kleines Suchskript für
            seine Seite basteln, das muss nicht perfekt sein,

            Aber er muß seinen Anwendern vermitteln, wie diese es
            bedienen sollen! Wie kann er das tun, wenn er selbst
            sich darüber noch gar nicht im Klaren ist?

            Viele Grüße
                  Michael