Variablen Wert auf "egal" setzen

  • Hallo,

    zur Zeit versuche ich mich etwas in MySQL und php einzuarbeiten.

    Bei meiner persönlichen Übung bin ich jetzt aber an einem ersten Knackpunkt angekommen:

    Ich habe eine Tabelle in der verschiedene Berufe stehen. Ich kann auch prima nach einem Beruf suchen, also wenn ich jetzt nach "Lehrer" suche werden auch alle Einträge gefunden. Die Abfrage soll aber neben dem Beruf auch weitere Variablen erhalten und es soll auch möglich sein, nichts einzugeben (oder vielmehr den Wert "egal" aus dem Dropdownmenü zu wählen) und dann soll man alle Berufe angezeigt bekommen. Wie mach ich das?

    Zur Veranschaulichung: http://idadi.id.ohost.de/db/

    PHP
    <?php
    $abfrage = "SELECT * FROM suche WHERE beruf='$beruf'";
    $ergebnis = mysql_query($abfrage);
    while($row = mysql_fetch_object($ergebnis))
       {
       echo "$row->id, $row->beruf, $row->plz, $row->wertung, <br>";
    
    
       }
    ?>

    Hoffe ihr wisst, was ich meine :rolleyes:

    Danke

  • Wenn nichts eingegeben wurde, ist die Variable leer, dann kannst du die Bedingung einfach weglassen.

  • danke für die schnelle Antwort!

    Kann man auch ein Auswahlfeld einfügen, das leer ist? Wenn ich nach <option> einfach nix schreibe funktioniert das leider nicht. Es wär aber wichtig, da es ja sein könnte, dass ich zuerst einen Beruf auswähle und dann mich aber umentscheide und alle berücksichtigen will - dann habe ich aber keine Auswahlmöglichkeit mehr...

  • Danke für das schnelle Antworten!

    Ich habe das jetzt mal ausprobiert, aber wenn ich dann unter dem oben genannten Link bei Berufe alle auswähle und in der letzten Box z.B. ** wird nichts gefunden obwohl entsprechende Datensätze existieren.

    Habe in der Zwischenzeit auch am Code geschraubt - vielleicht hab ich da was kaputt gemacht...

    Ich bedanke mich nochmals für die Mühen :rolleyes:

    2 Mal editiert, zuletzt von Questionmark (30. Dezember 2008 um 20:15)

  • Bsp.:

    HTML
    <select name='beruf'>
    <option value="Metzger">Metzger</option>
    <option value="">Alle</option>
    </select>

    Dann gehst du bei der auswertung folgendermaßen vor:

    PHP
    $where = empty($_POST['beruf']) ? "" : " WHERE beruf='".mysql_real_escape_string($_POST['beruf'])."'";
    // identisch mit:
    // if(empty($_POST['beruf']))
    //     $where = "";
    // else
    //     $where = " WHERE beruf='".mysql_real_escape_string($_POST['beruf'])."'";
    $abfrage = "SELECT * FROM suche".$where;

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Ja hast recht, hab ich grad nicht berücksichtigt.

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

  • Danke für den Lösungsansatz, den ich leider nicht ganz verstehe:

    Zitat


    Dann gehst du bei der auswertung folgendermaßen vor:

    PHP
    .......
    // else
    //     $where = " WHERE beruf='".mysql_real_escape_string($_POST['beruf'])."'";
    $abfrage = "SELECT * FROM suche".$where;

    Meine Fragen:

    1. Warum kann ich nach else nicht einfach schreiben $where = $beruf?
    wozu dient:WHERE beruf='".mysql_real_escape_string?

    2. was ist die Logik hinter dem Aufbau von $abfrage? Vor allem das .$where am Ende verwirrt mich.

    Sorry, aber ich beschäftige mich zum ersten Mal intensiver mit php :rolleyes:
    Gern nehme ich auch einen Link als Erklärung ;)

  • okay, dann versuch ich es nochmal in meinen eigenen Worten:

    für das $where in $abfrage wird der oben definierte Ausdruck gesetzt - also entweder '' oder der real_escape_string. Es wird sozusagen die Abfrage "dynamisch" zusammengebastelt.

    Wenn ich jetzt alles einzeln schreiben müsste (wie ja zuvor gemacht) dann müssten nach $abfrage die Anführungszeichen ja über den gesamten Ausdruck gehen - so wie hier:

    PHP
    $abfrage = "SELECT * FROM suche WHERE beruf='$beruf' AND wertung='$wertung'";

    was mich jetzt verwirrt, ist, warum nach der "besseren" Methode die Ausrufezeichen schon vor $where enden. Ich dachte das gehört schon gar nicht mehr dazu... :roll:

    EDIT: Ich glaub ich hab's gerad selber geschnallt: die Variable geht durch . verbunden einfach weiter und die neuen Anführungszeichen stehen ja schon in $where.

    richtig?

    Einmal editiert, zuletzt von Questionmark (31. Dezember 2008 um 11:25)

  • $abfrage = "SELECT * FROM suche" . $where;

    Da wird doch einfach eine Variable drangehängt. Du solltest dich unbedingt etwas mehr mit den Grundlagen beschäftigen.

  • Bsp.:

    HTML
    <select name='beruf'>
    <option value="Metzger">Metzger</option>
    <option value="">Alle</option>
    </select>

    Dann gehst du bei der auswertung folgendermaßen vor:

    PHP
    $where = empty($_POST['beruf']) ? "" : " WHERE beruf='".mysql_real_escape_string($_POST['beruf'])."'";
    // identisch mit:
    // if(empty($_POST['beruf']))
    //     $where = "";
    // else
    //     $where = " WHERE beruf='".mysql_real_escape_string($_POST['beruf'])."'";
    $abfrage = "SELECT * FROM suche".$where;

    Hi,

    diese Sache hat jetzt etwas geruht, ist nun aber wieder aktuell ;) :

    Das obige Beispiel leuchtet mir nun ein, aber ich bin leider nicht fähig die Idee einen Schritt weiter zu transferieren :oops:

    Wie ist es denn, wenn ich mehrere select - Auswahlboxen habe? Dann kann ich ja nicht einfach bei der Auswahl "alle" die Variable $where wieder auf "" setzen, oder? Muss ich dann pro Select-Box eine solche Abfrage straten und dann eben die Variablen $where1 bis $wherex erzeugen, die ich dann zum Schluss alle zusammenfasse?

    Brauch ich dann für jede Auswahlbox einen Code wie den obigen (jeweils mit anderer Variable) oder gibt es eine generelle Möglichkeit wie ich die Auswahl "alle" bei solchen select - Auswahlen behandeln kann.

    Hoffe, mein Problem ist halbwegs klar geworden... :roll:

    Danke

  • Wenn du der Auswahl "Alle" einen leeren value zuordnest, also

    HTML
    <option value="">Alle</option>

    dann kannst du in deiner Abfrage statt

    Code
    WHERE feld='$select_value'

    auch schreiben

    Code
    WHERE feld LIKE '%$select_value%'

    Bei der Auswahl alle steht dann in der Abfrage

    Code
    WHERE feld LIKE '%%'

    Dann kriegst du auch alle Ergebnisse.
    Der Nachteil ist, wenn du beispielsweise in deiner Select-Box folgende Einträge hast

    HTML
    <option>Computer</option>
    <option>Computer-Zubehör</option>

    dann werden bei der Auswahl "Computer" auch alle Einträge mit "Computer-Zubehör" gefunden, weil eben auch darin das Wort "Computer" enthalten ist.

    Hier ist eine Lösung die ich mal vor nem Jahr etwa umgesetzt habe, ich würde heut glaub einiges noch etwas anders machen, z.B. die Where-Bedingungen in einen Array packen und am Ende imploden wie bei Bandits Beispiel, aber es hilft dir vielleicht als kleiner Denkanstoß:

    "Programming today is a race between software engineers
    striving to build bigger and better idiot-proof programs,
    and the universe trying to build bigger and better idiots.
    So far, the universe is winning."
    Rick Cook

    4 Mal editiert, zuletzt von SinnlosS (18. Februar 2009 um 12:13)

  • hab mich jetzt an bandits Vorschlag gehalten und darunter noch folgendes gehängt:

    dummerweise bekomm ich jetzt ne Fehlermeldung:

    Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource

    Ich bin mal wieder aufgeschmissen - leider :cry: Was ist denn daran schon wieder falsch?

    Danke

  • okay - vielleicht mal für Doofe.

    Also im Handbuch habe ich folgendes gefunden

    PHP
    <?php
    $result = mysql_query('SELECT * WHERE 1=1');
    if (!$result) {
        die('Ungültige Abfrage: ' . mysql_error());
    }
    ?>

    also wird in $result das Ergebnis der Abfrage gespeichert

    Nach meinem zugegebener Maßen noch recht dürftigen Verständnis von php erhält hier

    PHP
    $query = "Select
                   feld1,
                   feld2,
                   feld3
                 from
                   tabelle";
    
       if (count($conditions))
          $query .= " where " . implode(" AND ", $conditions);

    $query ebenfalls die Informationen für die Abfrage.

    Oh, ich glaub soeben ist mir ein Licht aufgegangen. Ich poste jetzt meine Idee mal hier, bevor ich sie ausprobiere:

    Mit

    PHP
    $result = mysql_query('$query');

    sollte dann das Ganze doch klappen, oder?

    Ich probier's mal schnell :rolleyes:

    EDIT: Nee, tut's leidr nicht, aber ich habe das Gefühl, ich bin nah dran :D

    EDIT2:

    PHP
    $result = mysql_query($query);

    so passt's die Abfrage funktioniert zwar (noch) nicht, aber es gibt zumindest keine Fehlermeldung mehr ;)

    2 Mal editiert, zuletzt von Questionmark (24. Februar 2009 um 16:49)

  • !!!

    PHP
    $result = mysql_query($query)
       or die ("MySQL-Fehler mit $sql:<br>" . mysql_error());


    !!!