jens65: PHP Suche

Liebe Forum User,
ich würde gerne eine Suchfunktion in meine Seite einbauen.
Die Inhalte stammen alle aus der mysql Tabelle 'table' aus der spalte 'words'. gibt ein user etwas in die suche ein (z.b.test) wird er auf die seite www.example.com/index.php?word=test
auf dieser index.php wird dann eine abfrage gemacht mit

SELECT words FROM table WHERE words = $word  
  
$word = $_GET['word']

ist das eine gute Lösung oder gibts da eine bessere?
liebe Grüße,
Jens

  1. Hallöchen auch,

    $word = $_GET['word']

    Das ist eine ganz schlechte Idee. Usereingaben ungeprüft zu übernehmen ist sehr gefährlich, Stichwort: SQL-Injection

    Du solltest zumindest sowas, wie mysql_real_escape_string verwenden, um "böse" Usereingaben abzufangen.

    MfG
    cross

  2. Hallo Jens

    ist das eine gute Lösung oder gibts da eine bessere?

    Es ist eine schlechte Lösung. Teste doch mal was passiert wenn du Rock'n'Roll eingibst.
    Damit kannst du auch gleich testen ob magic_quotes bei dir aktiv ist ;)

    Dann kopiert man Variablen nicht um weil man damit deren Herkunft verschleiert. Ausserdem ist es unnötig.

    Das Thema SQL-Injection wurde bereits angesprochen.
    Du solltest es also so umformulieren:

      
    $query = mysql_query("SELECT words FROM table WHERE words = '".mysql_real_escape_string($_GET['word'])."' ");
    

    Noch 2 Sachen.

    • Normalerweise solltest du bei Formularen POST verwenden. In deinem Fall kann man GET aber auch verschmerzen.
    • Ich glaube nicht, dass die Zeile das tut was du willst. Im Erfolgsfall bekommst du genau das Wort zurück nach dem du gesucht hast. Mehr nicht. Das bringt irgendwie... gar nichts. Und du könntest gleich echo $_GET['word']; schreiben.

    Grüße, Matze

    1. Hallo,

      • Normalerweise solltest du bei Formularen POST verwenden. In deinem Fall kann man GET aber auch verschmerzen.

      es hängt vom konkreten Fall ab, ob man GET oder POST verwenden möchte.

      Ein semantischer Aspekt leitet sich schon von der Benennung der Methoden ab: Ist es der Hauptzweck des Requests, Daten vom Server abzurufen, verwende GET; ist der Hauptzweck dagegen, Daten zum Server zu übermitteln, verwende POST.

      Ein pragmatischer Ansatz kommt zu ähnlichen, wenn auch nicht exakt denselben Kriterien: Werden durch den Request Daten auf dem Server verändert (Dateien, Datenbank), ist POST angesagt, sonst GET.

      Als Faustformel sagt man auch gelegentlich: Ein GET-Request kann beliebig oft wiederholt werden, ohne dass sich die Response-Daten prinzipiell ändern (Aktualisierung durch andere Vorgänge mal außen vor).

      So long,
       Martin

      --
      Hannes würfelt abends immer, ob er den Abend mit seiner Frau zuhause verbringt oder in die Kneipe geht. Wenn er eine 6 würfelt, geht er in die Kneipe.
      Gestern musste er 37mal würfeln.
      1. Hello,

        Als Faustformel sagt man auch gelegentlich: Ein GET-Request kann beliebig oft wiederholt werden, ohne dass sich die Response-Daten prinzipiell ändern (Aktualisierung durch andere Vorgänge mal außen vor).

        bei der Gelegenheit mal nachgefragt:
        Es ging doch mal das Gerücht um (sogar mit Link), dass Google in Zukunft auch action-Attribute und Post-Requests als Linkziele auswerten wolle.

        Weiß jemand, was daraud geworden ist?

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
      2. Hi,

        Ein semantischer Aspekt leitet sich schon von der Benennung der Methoden ab: Ist es der Hauptzweck des Requests, Daten vom Server abzurufen, verwende GET; ist der Hauptzweck dagegen, Daten zum Server zu übermitteln, verwende POST.

        Guter Hinweis noch nie so gesehen, aber stimmt natürlich in der Regel. Meine eigenen Suchabfragen auf Seiten lasse ich allerdings per Post setzen, damit nicht jeder so einfach grabben kann, denn wie man serverseitig Postanfragen setzt, wissen zum Glück viele nicht. Was Google betrifft, klar wenn die von heute auf morgen auf POST wechseln würden, wär schon lustig.

        Mario

      3. Hallo,

        »» - Normalerweise solltest du bei Formularen POST verwenden. In deinem Fall kann man GET aber auch verschmerzen.

        Nunja, im konkreten Fall ist es ein Formular zur Suche und für diesen Fall empfehle ich die Methode GET. Weil: Damit wird eine "Suche mit Suchbegriffen" zu einem URI, der weitergegeben werden kann.

        Beispiel

        Btw., die Suchmaschinen dieser Welt machen das auch so (bewährterweise).

        Hotte

        --
        Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
  3. Schau dir mal die Volltextsuche von MySQL an:
    http://dev.mysql.com/doc/refman/5.1/de/fulltext-search.html

    z.B: ... WHERE MATCH ( words ) AGAINST ( '*search_word*' IN BOOLEAN MODE )

    ( Die Spalte words sollte dafür einen Index FULLTEXT erhalten )

    desweiteren gibt es auch noch LIKE

    z.B: ... WHERE words LIKE '%search_word%'

    [ % und * sind Platzhalter ]

  4. Also hab mir das ganze jetzt so vorgestellt. Funktioniert das so:

    SELECT words FROM table WHERE MATCH ( words ) AGAINST ('".mysql_real_escape_string($_GET['word'])."' ")

    oder hab ich jetzt einen Denkfehler?
    Lg, Jens

    1. Ausführbar ist es, aber natürlich ist so eine Suche schon ein bisschen komplizierter :D

      Ganzvereinfacht:

      1. Schauen, ob der Suchbegriff für die Volltext-Suche zu kurz ist ( <3 )
         und optional andere Modifizierungen[IN BOOLEAN MODE] vornehmen ( z.B: Suche in such* )

      2. Danach checken, ob was gefunden wurde ( $anz > 0 )
         [ list( $anz ) = fetch_row( query( "SELECT COUNT( * ) FROM ..." ) ) ]
        wurde nichts gefunden, evtl. Suche mit LIKE '%Suchbegriff%' wiederholen ( von Größe & Inhalt der Datenbank und dem Suchbegriff abhängig! )

      3. Und dann die Anfrage stellen ...