tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
15
ZUGRIFFE
664
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MagicMasterII MagicMasterII ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Baden-Wuerttemberg
    Beiträge
    44
    Ich habe folgendes Problem:
    Ich habe eine Suchmaschine mit PHP programmiert, die Datensätze aus eine MySQL Datenbank ausliest. Er soll aber natürlich nur die Datensätze anzeigen, nach denen gesucht wurde. Also habe ich eine If Abfrage eingebaut. Allerdings zeigt er jetzt nur noch einen Datensatz an, wenn genau dieser eingegeben wurde. Gibt es eine Möglichkeit (statt if($searchname == $row['searchname']), dass er auch Datensätze anzeigt, die eine Ähnlichkeit haben. Ich habe Beispielsweise eine Datensatz mit dem Name 'google.de'. Wie mache ich es, dass er auch diesen Datensatz anzeigt, wenn der Benutzer nur 'google' oder 'Google' angibt?

    Danke schonmal im Vorraus
    MagicMasterII
     

  2. #2
    thing thing ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Ort
    Hannover
    Beiträge
    75
    Hi,

    liest du beim Abfragen der MySQL Datenbank etwa alle Daten aus ? Wenn ja korrigiere doch einfach dein Query in Richtung:

    PHP-Code:
    $result = @mysql_query("SELECT column1,column2,column3 FROM table WHERE column2 LIKE '%google%'",$mysql_id); 
    Wenn du darauf angewiesen bist alle Datensätze abzufragen und im Nachhinein zu filtern kannste für PHP ja folgendes nehmen:

    PHP-Code:
    if (stripos($row['searchname'],$searchname) !== FALSE) {
        ...

    Gruß thing
     

  3. #3
    MagicMasterII MagicMasterII ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Baden-Wuerttemberg
    Beiträge
    44
    Irgendwie funktioniert dein Code nicht...
    So sieht es bei mir aus:
    PHP-Code:
    <html>
    <head>
    </head>
    <body style="border: 2px solid #FF9000" bgcolor="#303030" text="#FFFFFF" link="#FF8C00" vlink="#FF8C00" alink="#696969">
    <style>
    body
    {
    scrollbar-DarkShadow-Color:#FFFFFF;
    scrollbar-Track-Color:#505050;
    scrollbar-Face-Color:#333300;
    scrollbar-Shadow-Color:#606060;
    scrollbar-Highlight-Color:#FFFFFF;
    scrollbar-3dLight-Color:#606060;
    scrollbar-Arrow-Color:#FF6600;
    }
    </style>
    <font face="Comic Sans MS,Edwardian Script ITC">
    <?php
    error_reporting
    (E_ALL);
    include 
    'config.php';
    // Konfigurationsdatei laden
    @mysql_connect(MYSQL_HOSTMYSQL_USERMYSQL_PASS) OR die("Keine Verbindung zur Datenbank. Fehlermeldung:".mysql_error());
    mysql_select_db(MYSQL_DATABASE) OR die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());
    // Hier kann man jetzt MySQL-Querys senden
    $sql "SELECT
                    searchname,
                    link
                FROM
                    search;"
    ;
    // Das am Anfang immer ein paar Leerzeichen stehen
    // ist für MySQL uninteressant.
    // Hier würde sich sogar die Heredoc schreibweise
    // eignen
    $result mysql_query($sql) OR die(mysql_error());
    echo 
    "Resultate:<br /><br />\n";
    $searchfound 0;
    while(
    $row mysql_fetch_assoc($result)) {
    if(
    $searchname == $row['searchname']) {
    echo 
    "<table border=1><tr><td>";
    echo 
    "</td><td valign=\"top\"><a href=\"".$row['link']."\">".$row['searchname']."</a><br />\n";
    echo 
    "</td></tr></table>";
    $searchfound 1;
    }
    }
    if (
    $searchfound == 0) {
    echo 
    "Keine Seite konnte gefunden werden.";
    }
    ?>
    </font>
    </body>
    </html>
     

  4. #4
    Avatar von Sven Petruschke
    Sven Petruschke Sven Petruschke ist offline Mitglied Diamant
    Registriert seit
    May 2003
    Ort
    Leipzig
    Beiträge
    2.323
    Irgendwie funktioniert dein Code nicht...
    Ohne Deinen Quellcode durchgesehen zu haben:
    Was funktioniert nicht?
    Woran siehst Du das?
    Was passiert, wenn Du welche Suchbegriffe einsetzt?
    Welche Datensätze werden gefunden?
    Weche Datensätze sollten gefunden werden?

    Mach Dir mal ein bisschen Mühe ...
    snuu

    // EDIT:
    Du scheinst den Beitrag von thing überhaupt nicht berücksichtigt zu haben. Ich kann keine LIKE-Klausel im SQL-Statement entdecken.
    Geändert von Sven Petruschke (27.01.04 um 14:20 Uhr)
     
    Das Leben ist wie eine Ketchupflasche - erst kommt nichts und dann alles auf einmal.
    www.sven-petruschke.de

  5. #5
    tuxracer tuxracer ist offline Mitglied Brokat
    Registriert seit
    Mar 2003
    Beiträge
    373
    Ich kann Dir keine Code liefern, weil mit PHP kenn ich mich nicht sehr aus, aber ich kann Dir ein mögliches Prinzip erklären, wie Deine Suche funktionieren sollte.


    schrittweise erklärt


    1. musst Du damit beginnen, Deinen eingegebenen Begriff zu zerlegen in seine Bestandteile.Das heisst Du musst Anzahl der eingegebenen Buchstaben abfragen.
    2. nun musst Du mit dem ersten Buchstaben beginnend, in Deinem Beispiel Google das G in der DB zu suchen.

    3. sobald er ein G gefunden hat, muss er Deinen nächsten Buchstaben hoolen, also das o, und muss vergleichen, ob der Buchstabe nach dem in der DB gefundenen G auch wieder übereinstimmt, und auch ein o ist.

    4.Schritt drei wird so lange wiederholt, bis entweder keine übereinstimmung mehr da ist, oder die Anzahl der eingegebenen Buchstaben erreicht ist.

    falls die Anzahl Buchstaben erreicht wurde, musst Du diesen Datensatz, als Kanditaten zur Ausgabe zwischenspeichern.

    Ich hab das ganze natürlich jetzt sehr kurz gehalten, und es ist gut möglich, dass ich noch das eine oder andere vergessen hab, aber wenn Du Dir mal genau überlegst wie so ein Suchalgorythmus funktionieren sollte, in Sprachlicher form, dann wirst Du das nachher auch programmieren können.
     
    downloaded Linux

  6. #6
    thing thing ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Ort
    Hannover
    Beiträge
    75
    Mmh...

    Verstehst du was du da für Code hast ? Du hast eine MySQL Datenbank in der viele Datensätze liegen. Du möchstest jetzt (im Rahmen einer Suchfunktion) Datensätze aus der Tabelle ziehen.

    Deine Methode:
    Ich besorge mir alle Datensätze aus der Tabelle, gehe sie Zeile für Zeile in einer while-Schleife durch und wenn der eingegebene Suchbegriff dem Wert einer definierten Spalte (in deinem Fall anscheinend searchname) gleicht, dann gebe ich ihn aus.

    1. Problem
    Deine Methode ist absolut nicht performant weil du (angenommen deine Datenbank hätte 1000 Datensätze und davon enthalten 3 deinen Suchbegriff) ALLE Datensätze nach dem Suchbegriff durchsuchst und nicht nur die per MySQL besorgst in denen er auch wirklich vorkommt.

    2. Problem
    Die Ergebnisse sehen nicht so aus wie du denkst. Das liegt daran dass du dort if ($searchname == $row['searchname']) { stehen hast. Du machst einen direkten Vergleich zwischen 2 Variablen. Dein Suchstring hingegen ist ja nur ein Teil des Wertes aus der Tabelle, also schau doch einfach (siehe mein Posting) mit if (stripos($row['searchname'],$searchname) !== FALSE) { nach ob der String $searchname im String $row['searchname'] vorkommt.

    Diese zwei Probleme kannst du jetzt aber locker anders lösen in dem du dein MySQL Query so designst, dass du schonmal nur die Datensätze bekommst in denen dein Suchbegriff auch vorhanden ist (steht auch in meinem Posting) wobei du darauf achten solltest, dass in MySQL das % ein Platzhalter ist und nicht das * wie fast sonst überall. Dein 2. Problem tritt somit eigentlich garnicht mehr auf, weil du so oder so nur die Datensätze hast in denen der Suchbegriff vorkommt. Und wenn ich dir immer noch nicht helfen konnte, dann poste mal deinen Code MIT meinen Gimmicks !

    Gruß thing
     

  7. #7
    MagicMasterII MagicMasterII ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Baden-Wuerttemberg
    Beiträge
    44
    Original geschrieben von thing
    Mmh...

    Verstehst du was du da für Code hast ? Du hast eine MySQL Datenbank in der viele Datensätze liegen. Du möchstest jetzt (im Rahmen einer Suchfunktion) Datensätze aus der Tabelle ziehen.

    Deine Methode:
    Ich besorge mir alle Datensätze aus der Tabelle, gehe sie Zeile für Zeile in einer while-Schleife durch und wenn der eingegebene Suchbegriff dem Wert einer definierten Spalte (in deinem Fall anscheinend searchname) gleicht, dann gebe ich ihn aus.

    1. Problem
    Deine Methode ist absolut nicht performant weil du (angenommen deine Datenbank hätte 1000 Datensätze und davon enthalten 3 deinen Suchbegriff) ALLE Datensätze nach dem Suchbegriff durchsuchst und nicht nur die per MySQL besorgst in denen er auch wirklich vorkommt.

    2. Problem
    Die Ergebnisse sehen nicht so aus wie du denkst. Das liegt daran dass du dort if ($searchname == $row['searchname']) { stehen hast. Du machst einen direkten Vergleich zwischen 2 Variablen. Dein Suchstring hingegen ist ja nur ein Teil des Wertes aus der Tabelle, also schau doch einfach (siehe mein Posting) mit if (stripos($row['searchname'],$searchname) !== FALSE) { nach ob der String $searchname im String $row['searchname'] vorkommt.

    Diese zwei Probleme kannst du jetzt aber locker anders lösen in dem du dein MySQL Query so designst, dass du schonmal nur die Datensätze bekommst in denen dein Suchbegriff auch vorhanden ist (steht auch in meinem Posting) wobei du darauf achten solltest, dass in MySQL das % ein Platzhalter ist und nicht das * wie fast sonst überall. Dein 2. Problem tritt somit eigentlich garnicht mehr auf, weil du so oder so nur die Datensätze hast in denen der Suchbegriff vorkommt. Und wenn ich dir immer noch nicht helfen konnte, dann poste mal deinen Code MIT meinen Gimmicks !

    Gruß thing
    Das Problem ist, das beide deiner Codes nicht funktionieren. Bei dem mit stripos meldet er, dass die Funktion nicht definiert ist.

    Und bei der anderen sagt er:

    You have an error in your SQL syntax near ''search' WHERE 'searchname' LIKE '%google%'' at line 1

    MagicMasterII
     

  8. #8
    thing thing ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Ort
    Hannover
    Beiträge
    75
    Okay mein Fehler...

    Die Funktion stripos(); existiert erst ab PHP5 (ist im CVS schon verfügbar) und du dürftest bestenfalls PHP4.x einsetzen.

    Bei dem MySQL wäre es mal hilfreich wenn du den Code (mit LIKE drin) posten könntest...

    Gruß thing

    [edit]
    Es gibt ein Äquivalent dazu in PHP3/4 das ich vorher nicht gesehen habe: strpos();
    [/edit]
    Geändert von thing (27.01.04 um 16:49 Uhr)
     

  9. #9
    MagicMasterII MagicMasterII ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Baden-Wuerttemberg
    Beiträge
    44
    Original geschrieben von thing
    Okay mein Fehler...

    Die Funktion stripos(); existiert erst ab PHP5 (ist im CVS schon verfügbar) und du dürftest bestenfalls PHP4.x einsetzen.

    Bei dem MySQL wäre es mal hilfreich wenn du den Code (mit LIKE drin) posten könntest...

    Gruß thing

    [edit]
    Es gibt ein Äquivalent dazu in PHP3/4 das ich vorher nicht gesehen habe: strpos();
    [/edit]
    Jetzt funktioniert es mit der strpos-funktion... Aber nur wenn der Datensatz Beispielsweise 'Google' heißt und der User auch 'G' eingibt. Wenn er allerdings 'g' eingibt, wird der Datensatz nicht gefunden. Wie mache ich es aber, dass der Datensatz auch gefunden wird, wenn der Benutzer 'g' eingibt?
    Trotzdem Danke nochmal,
    MagicMasterII
     

  10. #10
    thing thing ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Ort
    Hannover
    Beiträge
    75
    AAAHHH... Zeig mir doch bitte bitte bitte dein MySQL Query *heul* !

    Ansonsten
    $searchstring = strtolower($searchstring);
    while (...) {
    if (strpos(strtolower(...),$searchstring) !== FALSE) {
    ...
    }
    }

    Gruß thing
     

  11. #11
    Avatar von Sven Petruschke
    Sven Petruschke Sven Petruschke ist offline Mitglied Diamant
    Registriert seit
    May 2003
    Ort
    Leipzig
    Beiträge
    2.323
    Jetzt funktioniert es mit der strpos-funktion... Aber nur wenn der Datensatz Beispielsweise 'Google' heißt und der User auch 'G' eingibt. Wenn er allerdings 'g' eingibt, wird der Datensatz nicht gefunden. Wie mache ich es aber, dass der Datensatz auch gefunden wird, wenn der Benutzer 'g' eingibt?
    Code :
    1
    
    ... where LCASE(Spaltenname) LIKE '%google%' ...

    snuu
     
    Das Leben ist wie eine Ketchupflasche - erst kommt nichts und dann alles auf einmal.
    www.sven-petruschke.de

  12. #12
    thing thing ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Ort
    Hannover
    Beiträge
    75
    Laut MySQL Manual kannste die Funktion nur auf einen String anwenden. Der Spaltenname ist aber ein Spaltenname und kein String... Außerdem ist LIKE IMHO sowieso case-insensitive.

    Gruß thing
     

  13. #13
    Avatar von Sven Petruschke
    Sven Petruschke Sven Petruschke ist offline Mitglied Diamant
    Registriert seit
    May 2003
    Ort
    Leipzig
    Beiträge
    2.323
    OK, hab's ausprobiert und die LIKE-Klausel ist wirklich case-insensitive. Dennoch kann man LCASE(Spaltenname) verwenden, um die Rückgabe der Datensätze aus der betreffenden Spalte in Kleinbuchstaben umzuwandeln. Und das funktioniert natürlich auch in der Where-Klausel für einen String-Vergleich. (Die Daten in der Spalte sind ja vom Typ String) Probier's aus.

    mfg, snuu
     
    Das Leben ist wie eine Ketchupflasche - erst kommt nichts und dann alles auf einmal.
    www.sven-petruschke.de

  14. #14
    thing thing ist offline Mitglied Silber
    Registriert seit
    Jan 2004
    Ort
    Hannover
    Beiträge
    75
    Und wieder was gelernt... Funktioniert jetzt wenigstens alles so wie du wolltest ?

    Gruß thing
     

  15. #15
    MagicMasterII MagicMasterII ist offline Mitglied Bronze
    Registriert seit
    Jan 2004
    Ort
    Baden-Wuerttemberg
    Beiträge
    44
    Original geschrieben von thing
    Und wieder was gelernt... Funktioniert jetzt wenigstens alles so wie du wolltest ?

    Gruß thing
    Nein, da ich nicht weiß, WO und WIE ich das einbauen muss. Ich habe doch meinen Code vorhin mal gepostet. Wie muss ich dass da einbauen, dass die Echo Befehle nur Ausgeführt werden, wenn der Suchstring in der Tabellenspalte enthalten ist, auch, wenn der Benutzer im Formular das Wort/den Buchstaben klein schreibt und er in der Datenbank groß ist. Außerdem ist der String, der enthalten sein muss, nicht festgelegt, sondern wird per HTML Formular an den PHP Script übermittelt.

    MagicMasterII
     

Ähnliche Themen

  1. Abfrage ähnlich --> Verwandte Themen auf tutorials.de
    Von son gohan im Forum Relationale Datenbanksysteme
    Antworten: 17
    Letzter Beitrag: 14.09.05, 19:09
  2. Ähnlich einfärben
    Von Dark_Fighter im Forum Photoshop
    Antworten: 6
    Letzter Beitrag: 20.08.04, 17:34
  3. Dropdwonmenüs...oda so ähnlich
    Von Tear im Forum Javascript & Ajax
    Antworten: 1
    Letzter Beitrag: 18.03.04, 17:35
  4. if ( ähnlich)
    Von melmager im Forum PHP
    Antworten: 12
    Letzter Beitrag: 21.08.02, 18:50
  5. wie ähnlich....?
    Von ttrenz im Forum Flash Plattform
    Antworten: 4
    Letzter Beitrag: 14.07.01, 22:49