[PHP] Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

Dieses Thema im Forum "Webentwicklung" wurde erstellt von marjot, 18. Juni 2008 .

Schlagworte:
  1. 18. Juni 2008
    Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Hi,
    ich wollte mal fragen ob mir jemand sagen kann wie ich das machen kann.
    Ich habe ein Textfeld wo man einen Namen eingibt.
    Dann möchte ich nach Abschicken des Formulars alle Datensätze aus einer Tabelle per "SELECT"-Befehl auswählen, die entweder einen Teil des eingegebenen Namens im Feld $row["vorname"] oder im Feld $row["nachname"]. Ich möchte also die beiden Felder durchsuchen und jeden Datensatz auswählen, der einen Teil des Suchstrings beinhaltet.

    Hat jemand ne Lösung für mich? BW bei guten Antworten ist Ehrensache!

    MfG
     
  2. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    PHP:
    $sql  "SELECT * FROM user WHERE vorname LIKE '%" . $_POST [ 'suche' ]. "%' OR nachname LIKE '%" . $_POST [ 'suche' ]. "%'" ;
     
  3. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Genau den selben Code habe ich auch schon ausprobiert:

    PHP:
    SELECT id vorname nachname 
                            FROM user 
                            WHERE vorname LIKE 
    '%".$_POST["txtName"]."%'
                            
    OR  nachname LIKE  '%".$_POST["txtName"]."%'";
    Dann kommt nur ein Ergebnis wenn ich entweder einen Suchstring eingebe, der dem Feld "vorname" ähnelt ODER wenn ich einen Suchstring eingebe, der dem Feld "nachname" ähnelt. Wenn ich einen String eingebe, der z.B. einen passenden Vornamen und einen passenden Nachnamen enthält, dann kommt kein Ergebnis :-(

    EDIT: Warum wurde einfach geschlossen? Ohne Begründung?!
     
  4. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    ich hab geschlossesn, weil ich davon ausging das der thread erledigt war.

    zu deinem fehler: das kann nicht sein, denn das wäre dann ein XOR (entweder a oder b aber nicht beides) und kein OR (entweder a oder b)
     
  5. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Ja das ist klar...dann sucht er ja auch im Nachnamen den Vornamen und umgekehrt... da kannst du nichts finden....

    Bei einer korrekten Suchabfrage müsstest du in dein Formular dann 2 Textfelder reinsetzen
    Vorname ......
    Nachname .......

    Und die beiden dann auslesen und entsprechend eine SQL Abfrage formulieren.
     
  6. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Dann warte doch bitte ab, dass ich auch sage, dass es erledigt ist. Es funktioniert nämlich so nicht. Ich habe schon viele Sachen ausprobiert. Sagen wir ich habe einen User der heißt ["vorname"]=Hans und ["nachname"]=Meyer.
    Wenn ich als $_POST["txtName"] = "Hans" als Suchstring übergebe, kommt ein Ergebnis.
    Wenn ich als $_POST["txtName"] = "Meyer" als Suchstring übergebe, kommt ein Ergebnis.
    Wenn ich als $_POST["txtName"] = "Hans Meyer" als Suchstring übergebe, kommt KEIN Ergebnis.


    Hm ich wollte es ja eigentlich mit einem Feld realisieren. Wie kann ich es machen, dass die Ergebnisse mit der höchsten Trefferquote dann als erstes ausgegeben werden? Also wenn jemand "Hans Meyer" eingibt, dass dann auch wirklich die Datensätze, die "Hans" und "Meyer" enthalten an oberster Stelle stehen?

    MfG
     
  7. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Hmmm einzig allein würde mir da folgendes einfallen:

    list($vorname, $nachname) = explode(" ", $_POST['suche']);

    Wenn du dann eingibst "Hans Mayer" steht in $vorname "Hans" und in $nachname "Mayer"

    aber das ist relativ unsauber weil du dann immer Vor-/ und Nachname eingeben musst... Außerdem kann ja mal ein leerzeichen im Vor oder Nachnamen vorkommen (Jan Eric Müller).

    Ich würde dir schon 2 textfelder empfehlen..
     
  8. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Code:
    select id, vorname, nachname
    from user
    where 
     vorname like '%{$name}%'
     || nachname like '%{$name}%'
     || concat_ws(' ', vorname, nachname) like '%{$name}%'
     
  9. 18. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Perfekt, die Abfrage funktioniert jetzt schon mal, wenn man entweder den vorname, oder den nachnamen oder beides eingibt. Vielen Dank schonmal an Murdoc!!!!
    Natürlich auch schonmal Danke an Coksnuss für die Mühe!!
    wenn ich jetzt machen möchte, dass z.B. bei der eingabe "hans dieter" alle datensätze mit den vornamen "hans" oder "dieter" gefunden werden müsste ich doch das anhängen:

    Code:
    || concat_ws(' ', vorname, vorname) like '%{$suchstring}%'
    
    Liege ich da richtig? EDIT: OK, funzt so nicht :-(

    Außerdem wüsste ich gerne, wenn das geht, wie man die Ergebnisse nach Relevanz ordnet. Kann mir jemand helfen?
     
  10. 19. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    du musst dein eingabewert zerlegen:
    PHP:
    <? php
    $suchstr 
    "hans dieter" ;
    $str  explode ( " " $suchstr );

    ?>
    Ordnen kannst du mit ORDER BY feld ASC|DESC am ende der Abfrage.
     
  11. 19. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    suboptimal, denn woher weißt du dass in der zeichenkette zwei vornamen sind?

    gib dem benutzer 3 eingabefelder (textarea) wo er vornamen, nachnamen und vor+nachnamen reinschreiben kann.
     
  12. 19. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    stimmt, aber es ist möglich mit Schleifen und IF-Abfragen eine SQL-Abfrage zusammen zu stellen, die leider viel zu lang wäre. 2x Formularfelder neben einander sind natürlich praktischer.
     
  13. 19. Juni 2008
    AW: Zwei Datenbankfelder mit nach einem Textfeldinhalt durchsuchen

    Da wir davon ausgehen können das du die Abfrage nicht nur einmal einsetzen willst:
    Code:
    CREATE INDEX voller_name ON user (vorname(10), nachname(10));
    Dazu auch: MySQL :: MySQL 5.0 Reference Manual :: 13.1.8 CREATE INDEX Syntax

    Und jetzt kannst du den SELECT auf den INDEX ansetzen:
    Code:
    SELECT id, vorname, nachname FROM user WHERE voller_name LIKE "%<deinSuchstring%";
    PHP:
    <? php
    function  searchuser ( $name ) {
    $searchstring  "% { $name } %" ;
    $db  = new  PDO ( "mysql:host=localhost;dbname=test" , "root" , "" );
    $statm  $db -> prepare ( "SELECT id,vorname,nachname FROM user WHERE voller_name LIKE :post" );
    $statm -> bindValue ( ":post" $searchstring );
    $statm -> execute ();
    return (array)
    $db -> result ;
    }
    Dazu auch: PHP: PDO - Manual
     
  14. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.