Suche in mehren Spalten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Suche in mehren Spalten

    Hallo Leute,

    ich brauche mal wieder eure hilfe. Nach dem ich bisher nur mit TXT-"Datenbanken" zu tun hatte, versuche ich mich nun an mysql. Bisher hatte mir Google immer ganz gut geholfen, aber im Moment drehe ich mich im kreis. Ich habe folgende Tabelle und möchte diese nun mit einer Suchfunktion ausstatten.

    | vorname | name | plz | ort | strasse |

    | Max | Mustermann | 01234 | Ort 1 | Strasse 1 |
    | Maximiliane | Musterfrau | 01234 | Ort 2 | Strasse 2 |


    An sich kein Problem. Aber das was ich bisher habe (Script weiter unten) ist für meine Ansprüche und die des Kunden nicht ausreichend.
    Solange ich mit meinem Script nach "max" suche werden beide treffer gefunden. Suche ich nun nach "max mustermann" wird nichts gefunden da sich dieser Name aus zwei Zellen zusammensetzt. Ebenso wird nichts gefunden wenn ich nach "mus man" suche. Ich konnte bisher weder einen Ansatz noch eine Lösung finden. Könnt ihr mir bitte helfen? Vielleicht hat schon jemand ein fertiges Script oder Snippet mit dem ich weiterarbeiten kann?

    Bisher habe ich auch nur WHERE und LIKE benutzt. Oder ist soch eine Suche grundsätzlich nur mit MATCH und AGAINST realisierbar?

    Hier eine abgespeckte Version meines php-Codes und der Aufruf über das Formular:

    Quellcode

    1. if($action == "1")
    2. {
    3. // Variablen per POST holen
    4. $m_suche_name = $_POST["m_suche_name"];
    5. $m_suche_plz = $_POST["m_suche_plz"];
    6. $m_suche_ort = $_POST["m_suche_ort"];
    7. // MySql-Datenbank öffnen
    8. $verbindung = @mysql_connect($mysql_server,$mysql_user,$mysql_passwort) or die("Keine Verbindung zur Datenbank moeglich");
    9. mysql_select_db($mysql_db_name) or die("Die Datenbank existiert nicht");
    10. // MySql-Injection unterbinden
    11. $vorname = mysql_real_escape_string($vorname);
    12. $name = mysql_real_escape_string($name);
    13. $plz = mysql_real_escape_string($plz);
    14. $ort = mysql_real_escape_string($ort);
    15. $strasse = mysql_real_escape_string($strasse);
    16. // Suchstring für mysql-Datenbank zusammen stellen
    17. $mysqlsearchstring = "";
    18. if ($m_suche_name != "")
    19. {
    20. $mysqlsearchstring .= " (vorname LIKE '%".$m_suche_name."%' OR name LIKE '%".$m_suche_name."%')";
    21. $mysqlsearchstringvorkommnis = "1";
    22. }
    23. if ($m_suche_plz != "")
    24. {
    25. if ($mysqlsearchstringvorkommnis != "")
    26. {
    27. $mysqlsearchstring .= " AND";
    28. }
    29. $mysqlsearchstring .= " plz LIKE '".$m_suche_plz."%'";
    30. $mysqlsearchstringvorkommnis = "1";
    31. }
    32. if ($m_suche_ort != "")
    33. {
    34. if ($mysqlsearchstringvorkommnis != "")
    35. {
    36. $mysqlsearchstring .= " AND";
    37. }
    38. $mysqlsearchstring .= " ort LIKE '%".$m_suche_ort."%'";
    39. }
    40. unset($mysqlsearchstringvorkommnis);
    41. // Daten aus MySql-Datenbank holen
    42. $abfrage = mysql_query("SELECT vorname, name, plz, ort, strasse FROM ".$table_mitglieder." WHERE ".$mysqlsearchstring." ORDER BY name ASC LIMIT ".$start.",20");
    43. while($row = mysql_fetch_object($abfrage))
    44. {
    45. $datensatz_vorname = $row->vorname;
    46. $datensatz_name = $row->name;
    47. $datensatz_plz = $row->plz;
    48. $datensatz_ort = $row->ort;
    49. $datensatz_strasse = $row->strasse;
    50. // ausgabe der Datensätze
    51. echo $datensatz_vorname." ".$datensatz_name."
    52. ";
    53. echo $datensatz_plz." ".$datensatz_ort.", ".$datensatz_strasse."
    54. ";
    55. }
    56. // Datenbank-Verbindung schließen
    57. mysql_close($verbindung) or die("Die Datenbank-Verbindung konnte nicht beendet werden");
    58. }
    Alles anzeigen


    Den HTML-Quellcode kann ich euch leider nicht zeigen da das Board sich dagegen wehrt :cursing: .

    PS: Das neue Easy-Coding-Board macht bei mir massive probleme! Wenn ich zb. PHP-Code einfüge stellt das Board den ganzen Quelltext erst in einer Zeile dar und bei der Vorschau passt es dann auf einmal. Des weiteren Möchte ich HTML-Code mit Formularfelder einfügen welche erstens als "Richtige" Felder angezeigt werden (Also nicht als HTML-Code) und zweitens ist bei der Vorschau der ganze HTML-Quelltext weg und die Texteinrückungen im PHP-Code ebenfalls. Ich habe es mit dem IE und FF Probiert. Gleiches ergebniss. Mache ich was falsch? Das Alte fand ich besser! :(
  • @Foren-Problem: Poste mal im Feedback Forum, mit meinem Firefox habe ich keine Probleme.

    Ansonsten würde ich bei einer Suche in mehreren Spalten wohl mit einem Index über alle Spalten arbeiten. Vor allem weil es performanter ist. Also am Besten du nimmst den den FULLTEXT Index.
    Dann hast du keine Probleme.

    "Alternativ" (aber eher schlechter) bleibt bei einer solch variablen Eingabe wirklich nur die Möglichkeit alle Spalten entweder mit CONCAT zu verinden und darin zu suchen. Oder eben LIKE auf alle anzuwenden.
  • Hallo dOnut,

    erst mal danke für deine Rasche Antwort.
    Ich habe im sqladmin-Bereich die Spalte "vorname" und "name" markiert und anschließend auf das "Folltext-Icon" (T) geklickt. Nun Steht im sqladmin-Bereich unter Indized Folgendes:

    Name = Vorname | Typ = FULLTEXT | Kardinalität = 1 | Feld = vorname name

    In meinem Code habe ich die Zeile 23 wie folgt geändert:

    Quellcode

    1. $mysqlsearchstring .= " MATCH (vornmane,name) AGAINST ('".$m_suche_name."')";

    Leider wird jetzt garnichts mehr gefunden. Was habe ich falsch gemacht? Warscheinlich einfach nur ein simpler Anfänger-Fehler!

    Gruß KMD
  • Hallo dOnut,

    doch, hat funktioniert ohne die Indexierung neu anzustosen. Frag mich bitte nicht warum das ging :whistling:, ich habe noch nicht so den Plan von mysql. Habe dann eine Boolsche Suche laut dev.mysql.com/doc/refman/5.1/de/fulltext-boolean.html daraus gemacht. Lieferte aber auch nicht das gewünschte Ergebniss. Warscheinlich habe ich irgentas vergessen oder falsch gemacht. greife nun wieder zurück zu LIKE welches ich mit einem Array füttere. Das Snippet schaut nun wie Folgt aus. Vielleicht kanns jemand gebrauchen

    Quellcode

    1. $such_string = $m_suche_name;
    2. $array = explode(' ',$such_string);
    3. for($x = 0; $x < count($array); $x++) {
    4. // Wenn mehrere strings im Array sind, dann den Operator AND hinzufügen
    5. if ($x > 0 && $x < count($array)) {
    6. $mysqlsearchstring .= " AND";
    7. }
    8. $mysqlsearchstring .= " (vorname LIKE '%".$array[$x]."%' OR name LIKE '%".$array[$x]."%')";
    9. }

    Ob das nun umbedingt schlauer war kann ich dir nach meinem Wissenstand nicht sagen. Aber es funktioniert.
    Ist vielleich nicht gerade mega-performant, aber mehr wie 1000 Datensätze kommen eh nicht zusammen. Trotzdem danke für deine Mühe. Habe mal wieder was dazu gelernt 8)

    Gruß KMD