[PHP / SQL] - WHERE OR AND OR AND OR....



  • Hallo Zusammen

    Wie krieg ich es hin, dass mit einer WHERE-Klausel vier verschiedene Faktoren mit OR gesucht werden? Es sollte lediglich nur ein Kriterium gefunden werden oder alles.

    Beispiel eines Formulars:
    Kundennummer
    Nachname
    PLZ
    Ort

    Wird alles ausgefüllt, sollten nur die Datensätze erscheinen, welche alle eingegeben Bedingungen erfüllen. Wird aber nur der Nachname und der Ort angegeben, sollten nur die Datensätze mit den Bedingen Nachnamen und Ort angezeigt werden, die mit dem eingegeben übereinstimmen.

    Gibt man nur EINES als Suchwort ein, sollte nur der Datensatz erscheinen, mit dem gesucht worden war. Lässt man alle Felder LEER, so sollten ALLE Datensätze angezeigt werden.

    Mit zwei Abfragen wir Kundennummer und Nachnamen hatte es bisher sehr gut geklappt. Aber sobald ich nun zwei mehr (Plz und Ort) hinzufüge, gehts nun icht mehr, dann mach die DB was sie will... ist hier irgendwas falsch ??

    $sql ="SELECT * FROM clt_stdata  WHERE KundenNr = '".$_POST['clt_nr']."' OR Nachname = '".$_POST['clt_name']."' OR PLZ = '".$_POST['clt_plz']."' OR Ort = '".$_POST['clt_ort']."' ORDER BY KundenNr ASC LIMIT ".$start.",".$limit."";
    

    Vorhin mit nur KundenNr und Nachname klappte es:

    $sql ="SELECT * FROM clt_stdata  WHERE KundenNr = '".$_POST['clt_nr']."' OR Nachname = '".$_POST['clt_name']."' ORDER BY KundenNr ASC LIMIT ".$start.",".$limit."";
    

    Braucht es hier noch ein AND? Muss es ev. AND OR heissen? Wenn ja, hab ich auch getestet. Ging nicht...

    lg
    Wolf



  • Hallo Wolf1985,

    deine Abfrage:

    $sql = "SELECT * FROM clt_stdata  WHERE KundenNr = '".$_POST['clt_nr'].
           "' OR Nachname = '".$_POST['clt_name']."' OR PLZ = '".
           $_POST['clt_plz']."' OR Ort = '".$_POST['clt_ort'].
           "' ORDER BY KundenNr ASC LIMIT ".$start.",".$limit."";
    

    erscheint mir syntaktisch soweit korrekt. AND OR oder ähnliches ist Unfug.

    Die Datenbank macht ganz bestimmt nicht, was sie will. Sie macht das, was du ihr sagst, nämlich alle Datensätze in sortierter Reihenfolge ausgeben, auf die zutrifft:
    Nachname ist der Gesuchte, oder
    Kundennummer ist die Gesuchte, oder
    Postleitzahl ist die Gesuchte, oder
    Ort ist der Gesuchte.

    Denk noch einmal darüber nach, was das heißt. Es wird jeder Datensatz gefunden, auf den eine Beliebige der vier Bedingungen zutrifft, oder eine beliebige Kombination der Bedingungen, solange mindestens eine zutrifft. Das heißt im Klartext, wenn du nach einem Namen und einer Kundennummer suchst, wird jeder Datensatz gefunden, der entweder im Namen oder der Nummer (oder beidem) mit deiner Suchanfrage übereinstimmt.

    Ich denke, du willst eigentlich keine ODER-, sondern eine AND-Verknüpfung, denn alles andere erscheint mir hier kausal betrachtet unsinnig zu sein.

    MfG,
    árn[y]ék

    P.s. Und informiere dich bitte dringendst zum Thema SQL-Injections.



  • Nein eigentlich eben nicht.
    Ich hab eine Datenbank mit verschiedenen Kunden die an verschiedenen Orten Wohnen, verschieden heisen und versschiedene Kundennummern haben.

    Ich möchte nach PLZ, Ort, Kundenummer und Nachname suchen können. Wird nur "eines" der Suchkriterien eingegeben, sollte auch nur nach dem gesucht werden. Werden Nr und Nachname eingegeben, sollte auch nur nach nr und nachname gesucht werden,.

    Wird alles ausgefüllt, sollte nach allem gesucht werden. Ich vermute dass ich da vorher eine IF-Abfrage starten muss??

    Meine Vorstellung der Lösung:

    if($feld_nummer == true)
    {
    $sql = .... WHERE KundenNr = ...
    }
    if(($feld_nummer == true) && ($feld_nachanme == true)
    {
    $sql = ... WHERE KundenNr AND nachname...
    }
    ...
    usw...
    

    Es gibt sicherlich eine elegantere Lösung?



  • Latürnich gibt es da elegantere Lösungen.

    Du bekommts vermutlich die Suchbegriffe als CGI-Variable (ich verwende kein PHP),
    also kannst Du auch nachsehen ob da überhaupt etwas als Suchbegriff eingetragen
    wurde. Vorrausgesetzt, Du kennst die Namen der CGIs, kannst Du in einer Schleife
    die Suchanfrage aufbauen.



  • Betreffend SQL-Injection...

    Wenn ich nun folgende Variante verwende:

    $sql ="SELECT * FROM clt_stdata  WHERE KundenNr = '".intval($_POST['clt_nr'])."' OR Nachname = '".intval($_POST['clt_name'])."' ORDER BY KundenNr ASC LIMIT ".$start.",".$limit."";
    

    und danach nur nach dem Nachnamen suchen möchte, passiert nichts, respektive er findet nichts ! Suche ich nur nach der Kundennummer, gehts wie gewollt.

    Lasse ich die Option "intval" weg, geht beides. An was liegt dass denn nun?



  • NAja, ich hab es nun mal vorübergehend per IF und ELSE IF gelöst. 🙂


Anmelden zum Antworten