SQL Suche und IF?

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

  • SQL Suche und IF?

    Hey ich schonwieder^^ Diesemal geht es um Sql in Verbindung mit einer PHP Suche.

    Meine Frage ist, wenn ich drei input felder haben z.b. Vorname, Nachname, Alter, wie sieht die dazugehörige abfrage aus?

    Ich meine jetzt nicht mit like oder match, sondern, man könnte ja zum beispiel nur den vorname eingeben, und die beiden anderen felder leer lassen.

    Wir nehmen mal an die Variablen sind schon definiert. Gebe ich jetzt bei vorname: Maria ein, und bei nachname und alter nichts, sucht er ja wo vorname= maria ist, nachname=leer und alter=leer.
    Aber er soll ja alles raussuchen, wo der name Maria ist..Die anderen Felder sind in dem moment wo sie nicht ausgefüllt wurden nicht relevant

    Quellcode

    1. //$db = meine mysql klasse
    2. $suche = $db->query("SELECT * FROM xxx WHERE vorname="$vorname" && nachname="$nachname" && alter="$alter"");


    Kann man das ganze mit einer art if abfrage machen? So in der art:

    Quellcode

    1. $suche = $db->query("SELECT * FROM xxx WHERE vorname="$vorname" && if(strlen($nachname)>0){ nachname="$nachname &&"} alter="$alter"");

    Das funktioniert natürlich nicht. Aber wie denn dann, jemand eine Ahnung? :)
  • 1.
    Der code da würde von php her nicht funktionieren

    Quellcode

    1. "SELECT * FROM xxx WHERE vorname="$vorname" && nachname="$nachname" && alter="$alter""
    2. |________________________________|________|_____________|_________|__________|______||
    3. String Variable String Variable String Varaible

    Die doppelten anführungsstriche dienen dazu in php den string zu begrenzen. Willst du nun doppelte striche im string verwenden musst du sie maskieren -> \"

    (Saubere) Möglichkeiten (achtung bei sql inj!!):

    Quellcode

    1. "SELECT * FROM xxx WHERE vorname=\"".$vorname."\" && nachname=\"".$nachname."\" && alter=\""$alter"\""
    2. //oder
    3. 'SELECT * FROM xxx WHERE vorname="'.$vorname.'" && nachname="'.$nachname.'" && alter="'.$alter.'"'

    Wie schon beschrieben ist der code anfällig für sql injections. Die varaiblen sollten mit mysql_real_scape string oder mysql_escape_string escaped werden oder direkt prepared statements mit mysqli oder pdo verwendet werden.

    2. Warum die IF abfrage in mysql? Kannst es auch direkt in php machen

    Quellcode

    1. $substrings = array('vorname' =>'vorname="'.$vorname.'"',
    2. 'nachname' => 'nachname="'.$nachname.'"',
    3. 'alter' => 'alter="'.$alter.'"');
    4. $copysstrings = $substrings;
    5. if (!$vorname)
    6. unset($copysstrings['vorname']);
    7. if (!$nachname)
    8. unset($copysstrings['nachname']);
    9. if (!$alter)
    10. unset($copysstrings['alter']);
    11. if ($copysstrings)
    12. {
    13. $query = 'SELECT * FROM xxx WHERE '.implode(' AND ',$copysstrings);
    14. }
    15. else
    16. {
    17. //die('Kein suchbegriff');
    18. }
    Alles anzeigen

    Auch da: ESCAPEN!! Gegen mysql-injection...
  • Achja ich hab die slashes vergessen, dass kann dann so echt nicht funktionieren 8o Und das mit dem absichern ist auch klar, das mach ich mit allen sql variablen. aber danke :)
    Das mit der if frage in mysql. war nur ein beispiel um zu verdeutlichen was ich meinte, da ich nicht wusste wie ich es anders lösen soll :P

    Aber schonmal danke :) hast du das script auch getestet?

    Ich hab mal $vorname definiert, mit einenem namen der in der datenbank ist. also $vorname="Anna"; Aber es liefert leider kein ergebnis?


    Geht schon, hatte ein fehler gemacht sry. Also danke für dein Script. Hab wieder was dazu gelernt :D

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Snowflake ()

  • Quellcode

    1. <?php
    2. $vorname = 'x';
    3. $nachname = 'y';
    4. $alter = 'z';
    5. $substrings = array('vorname' =>'vorname="'.$vorname.'"',
    6. 'nachname' => 'nachname="'.$nachname.'"',
    7. 'alter' => 'alter="'.$alter.'"');
    8. $copysstrings = $substrings;
    9. if (!$vorname)
    10. unset($copysstrings['vorname']);
    11. if (!$nachname)
    12. unset($copysstrings['nachname']);
    13. if (!$alter)
    14. unset($copysstrings['alter']);
    15. if ($copysstrings)
    16. {
    17. $query = 'SELECT * FROM xxx WHERE '.implode(' AND ',$copysstrings);
    18. }
    19. else
    20. {
    21. //die('Kein suchbegriff');
    22. }
    23. echo $query;
    24. ?>
    Alles anzeigen

    Habs so getestet
    Ausgabe:
    SELECT * FROM xxx WHERE vorname="x" AND nachname="y" AND alter="z"

    Also theoretisch kein fehler