Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Wie kann man mehrere Dropdown-Menü-Werte mit einem Button an POST-Variable

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Wie kann man mehrere Dropdown-Menü-Werte mit einem Button an POST-Variable

    Hallo php.de-Community!
    Ich stoße als Neuling mal dazu - meine Kenntnisse sind ein wenig fortgeschritten.

    Hier zu meinem Problem:

    Ich habe 3 HTML-Dropdown-Menüs, deren eingestellte Werte mit dem Button an das PHP-Skript übergeben werden sollen.
    Mit EINEM Wert funktioniert das auch, allerdings nicht mehreren.
    Eigentlich ist es logisch, denn der Button übergibt wahrscheinlich auch nur einen Wert.

    Das Problem ist: Ich weiß leider nicht, wie ich es anders umsetzen soll.

    Hier mal der Code:

    Code:
    <td>
    
    <form action="http://localhost/country.php" class="tfsearch" method="post">
    
    <B><Font Color=white>Country:</font></b>
    <select name="book">
    <option value="Afghanistan">Afghanistan</option>
    <option value="Albania">Albania</option>
    <option value="Algeria">Algeria</option>
    <option value="Andorra">Andorra</option>
    <option value="Angola">Angola</option>
    </select>
    
    <B><Font Color=white>Number:</font></b>
    <select name="number">
    <option value="10">1-10</option>
    <option value="20">11-20</option>
    <option value="30">21-30</option>
    <option value="50">31-50</option>
    </select>
    
    <B><Font Color=white>Year:</font></b>
    <select name="year">
    <option value="1950">1900-1950</option>
    <option value="1970">1951-1970</option>
    </select>
    
    <input type="hidden" name="action" value="book" />
    <input type="submit" value="Suchen" />
    </form>
    PHP-Code:
    <?php

    include('database.inc.php');

    $book_country $_SESSION['book_country'];
    $book_number $_SESSION['book_number'];
    $book_year $_SESSION['book_year'];

    unset(
    $error);


    if (
    (
    $_SERVER['REQUEST_METHOD']=='POST' && isset($_POST['action']))
    ||
    (
    $_SERVER['REQUEST_METHOD']=='GET' && isset($_GET['action'])))
    {
    switch (
    $_REQUEST['action'])
    {


    case 
    'book':




    [
    B]$result $mysqli->query("SELECT * FROM alldata WHERE country = '{$_POST['book']}' AND number > 500 ORDER BY number");[/B]



    $seven $mysqli->query("SELECT table FROM alldata
    WHERE country = '
    {$_POST['book']}'");

    if (
    $result->num_rows >= 1)
    {

    $abc $seven->fetch_assoc();



    echo 
    "
    <div class=\"review\" id=\"dw\">
    <B>The following data belong to country <font color=\"red\">&nbsp;"
    .$abc['country']."&nbsp;</font>:</B><BR>
    </div>"
    ;



    while (
    $arr $result->fetch_assoc()) { 

    echo 
    "


    <div class=\"review\" id=\"dw\">

    <table class=\"sng\" cellpadding=\"1\" cellspacing=\"0\">

    <col width=\"100\">
    <col width=\"300\">
    <col width=\"300\">
    <col width=\"100\">
    <col width=\"100\">


    <tbody>

    <tr>
    <th>Country</th>
    <th>Number</th>
    <th>Year</th>

    </tr>"
    ;





     


    $book_country $arr['country'];
    $book_number $arr['number'];
    $book_year $arr['year'];


    echo 
    "
    <tr id=\"1\" bgcolor=\"#f5f5f5\">
    <td>

    <form action=\"http://localhost/country.php?countryid="
    .$arr['countryid']."\" method=\"post\">
    <input type=\"hidden\" name=\"action\" value=\"book\" />
    <input type=\"submit\" name=\"book\" value=\""
    .$arr['countryid']."\" />
    </form>



    </td>
    <td>"
    .$arr['country']."</td>
    <td>"
    .$arr['number']."</td>
    <td>"
    .$arr['year']."</td>
    </tr>


    </tbody>
    </table>


     </div>"
    ;

    }

      
    $result->close();

    }

    }

    }

    ?>
    Wie gesagt, mit einem Wert (also nur Country) funktioniert es;
    der Ablauf sieht dann so aus:

    1. Ich wähle "Afghanistan" aus dem Dropdown-Menü aus.
    2. Der "book"-Wert wird per Button als POST-Variable gesendet.
    3. Der case 'book' wird ausgeführt.
    4. Die SQL-Abfrage wird erzeugt und dann wird die while-Schleife ausgeführt und gibt die Daten aus.

    Das funktioniert aber nur deshalb, weil diese SQL-Abfrage auch nur auf einen Übergabewert zugeschnitten ist:

    $result = $mysqli->query("SELECT * FROM alldata WHERE country = '{$_POST['book']}' AND number > 500 ORDER BY number");

    Ich möchte dieses fett markierte AND number > 500 ja ersetzen, indem ein zweiter Wert übergeben wird. Nämlich der aus dem zweiten Dropdown-Menü "Year".

    Die SQL-Abfrage sollte dann so aussehen:

    $result = $mysqli->query("SELECT * FROM alldata WHERE country = '{$_POST['book']}' AND year = '{$_POST['year']}' ORDER BY number");

    Ich weiß jetzt aber nicht, wie ich das umsetzen soll.
    Muss ein zweiter bzw. dritter case definiert werden?

    Ein Merkmal ist noch, dass in dem einen Dropdown-Menü der name "book" heißt und nicht "country".

    Ich hab schon sehr viel versucht - Codeteile verschoben, andere Variablen ausprobiert, aber es hakt schon allein daran, dass ich nicht weiß, wie ich die Werte aus den Dropdown überhaupt richtig verknüpfe, um die SQL-Abfrage mit drei Werten gleichzeitig durch Drücken eines Buttons auszuführen.

    Auch schon überall gesucht, aber ich finde leider häufig nur, wie man Werte aus der DB direkt in das Menü einliest. Also nichts richtiges für mein Problem.

    Ich bin für jede Hilfe dankbar.
    Am hilfreichsten wäre es, wenn jemand mir ein funktionsfähiges Muster gibt, wie so eine Abfrage mit mehreren Bedingungen aussieht.

    PS: Ich weiß, dass der Code nicht ganz das Gelbe vom Ei ist bzw. anfällig ist für SQL-Injection.
    Das wird hinterher ausgebügelt, sobald das ganze Zeug lauffähig ist. Soll ja auch vorderhand nicht published werden.

    Grüße

  • #2
    Uaahh, Gruselcode. Bitte rücke deinen Code vernünftig ein. Das hilft auch dir!

    Code:
    $result = $mysqli->query("SELECT * FROM alldata WHERE country = '{$_POST['book']}' AND year = '{$_POST['year']}' ORDER BY number");
    Du hast nicht geschrieben, ob es funktioniert oder nicht, geschweige denn, ob du es ausprobiert hast.

    Ein Merkmal ist noch, dass in dem einen Dropdown-Menü der name "book" heißt und nicht "country".
    Das ist kein Merkmal, das ist Murks.

    Am hilfreichsten wäre es, wenn jemand mir ein funktionsfähiges Muster gibt, wie so eine Abfrage mit mehreren Bedingungen aussieht.
    Mach doch erst mal ein paar Tutorials zu MySQL und PHP.

    Muss ein zweiter bzw. dritter case definiert werden?
    Das sind Fragen, die mir sagen (woha, reimt sich sogar ), dass dir noch einige Grundlagen fehlen. Programmieren hat weniger etwas mit Raten zu tun.

    PS: Ich weiß, dass der Code nicht ganz das Gelbe vom Ei ist bzw. anfällig ist für SQL-Injection.
    Das wird hinterher ausgebügelt, sobald das ganze Zeug lauffähig ist. Soll ja auch vorderhand nicht published werden.
    Mach das doch bitte sofort. Ich habe jedenfalls keine Lust, dich auf alle möglichen Fehlerquellen aufmerksam zu machen und das nur, weil du "alles hinterher beheben möchtest".

    Gruß
    [URL]http://hallophp.de[/URL]

    Kommentar


    • #3
      Hallo Asipak!

      Zitat von Asipak Beitrag anzeigen
      Du hast nicht geschrieben, ob es funktioniert oder nicht, geschweige denn, ob du es ausprobiert hast.
      Ja, es funktioniert mit der Übergabe EINES Wertes. Nämlich dann, wenn nur 'book' übergeben wird. Wie werden DREI Werte auf einmal ('book', 'number' und 'year') per Submit-Button übergeben und dann an die SQL-DB geschickt?

      Zitat von Asipak Beitrag anzeigen
      Das ist kein Merkmal, das ist Murks.
      Ich bin wie gesagt ein eher fortgeschrittener Anfänger, was PHP angeht.
      Sobald ich weiß, wie der Code aussieht, kann ich damit gut weiterarbeiten. Aber das ist beim Durchlesen von Büchern nichts anderes. Programmieren lernt man ja auch, indem man Code aus Büchern und Tutorials reproduziert, mit diesen dann herumspielt und abändert. Zumindest ist das bei mir so.

      Zitat von Asipak Beitrag anzeigen
      Mach doch erst mal ein paar Tutorials zu MySQL und PHP.
      Ja, die hab ich ja schon gemacht, sonst wäre ich zumindest nicht so weit gekommen.

      Zitat von Asipak Beitrag anzeigen
      Das sind Fragen, die mir sagen (woha, reimt sich sogar ), dass dir noch einige Grundlagen fehlen. Programmieren hat weniger etwas mit Raten zu tun.
      Das will ich nicht bestreiten.
      Hilfreich wäre es zu wissen, woran es hakt, weil ich sonst dazu nichts passendes gefunden hab.

      Zitat von Asipak Beitrag anzeigen
      Mach das doch bitte sofort. Ich habe jedenfalls keine Lust, dich auf alle möglichen Fehlerquellen aufmerksam zu machen und das nur, weil du "alles hinterher beheben möchtest".
      Es soll doch ohnehin erstmal nur die Abfrage funktionieren. Da das ganze nicht published wird, bin ich nicht unter Zeitdruck, dieser Lösung von der Priorität her erst mal hintenanzustellen. Zumal ich in dem Gebiet der Sicherheitsfragen wirklich noch großen Lernbedarf habe. Vielleicht werde ich dafür sogar jemanden ranlassen, der eine komplette Coderevisionierung macht, der dann auch bezahlt werden muss.
      Aber dafür sollen erst mal die ganzen Funktionen laufen, damit Funktionen nicht erstellt, sondern nur umgestrickt werden müssen.

      Kommentar


      • #4
        Wie werden DREI Werte auf einmal ('book', 'number' und 'year') per Submit-Button übergeben und dann an die SQL-DB geschickt?
        PHP-Code:
        if ($_POST) {
          echo 
        '<pre>'print_r($_POST), '</pre>';

        Zeigt dir an, was nach dem Absenden des Formulars so alles übermittelt wurde.
        Aber dafür sollen erst mal die ganzen Funktionen laufen, damit Funktionen nicht erstellt, sondern nur umgestrickt werden müssen.
        Refactoring ist hin und wieder unangenehmer als den Code neu zu schreiben.
        [URL]http://hallophp.de[/URL]

        Kommentar


        • #5
          Zitat von Asipak Beitrag anzeigen
          PHP-Code:
          if ($_POST) {
            echo 
          '<pre>'print_r($_POST), '</pre>';

          Zeigt dir an, was nach dem Absenden des Formulars so alles übermittelt wurde.
          Der Tipp ist schon mal gut.

          Wenn die entsprechenden Werte im Menü eingestellt sind, gibt es mir aus:

          PHP-Code:
          Array
          (
          [
          book] => Andorra
          [number] => 200
          [year] => 2002
          [action] => book
          )

          Ich verstehe das so, dass alle drei Variablen mit einem Submit übergeben werden.

          Das heißt, es müsste eigentlich nur ein korrekter SQL Query erstellt werden?
          Eine Definition von Cases ist damit nicht notwendig, oder?

          Kommentar


          • #6
            Das heißt, es müsste eigentlich nur ein korrekter SQL Query erstellt werden?
            Ja.
            Eine Definition von Cases ist damit nicht notwendig, oder?
            Wie gesagt, wenn du nur Vermutungen anstellen kannst, fehlen dir noch Grundlagen.
            [URL]http://hallophp.de[/URL]

            Kommentar


            • #7
              Zitat von Asipak Beitrag anzeigen
              Wie gesagt, wenn du nur Vermutungen anstellen kannst, fehlen dir noch Grundlagen.
              So wie ich das bisher in den Tutorials verstanden habe, wird ein sogenanntes superglobales Array an POST übergeben. Damit also alle drei Werte, die in deinem Prüf-Code angezeigt werden.

              Um mir in Sachen felsenfest sicher zu sein, fehlt es mir hauptsächlich an Training. Das kann ich aber nicht erzwingen, das kommt mit der Zeit. Zumal ich auch noch nicht so viel mit PHP bisher gemacht habe.
              Ich gebe mir aber Mühe, es zu lernen.

              Kommentar


              • #8
                $_POST ist eine Superglobale und sie enthält die Formulardaten.

                PHP: Superglobals - Manual
                [URL]http://hallophp.de[/URL]

                Kommentar


                • #9
                  @Asipak: Auf jeden Fall hat mir das gut weitergeholfen.

                  Ich hab den SQL-Query entsprechend abgeändert und jetzt funktioniert es hervorragend.

                  Und um die Sicherheit werde ich mich entsprechend auch kümmern.
                  Setzen von mysql_real_escape_string usw.

                  Zu Professionalität gehört ja auch, seine Fähigkeiten einigermaßen einschätzen zu können und da ich weiß, dass in diesem Fall noch einiges zu lernen ist, kann ich dich beruhigen: Ich werde solange nichts publishen, bis das Sicherheits-Risiko minimiert ist und solche groben Fehler ausgeschlossen sind.

                  Auf jeden Fall für die Weiterhilfe schon mal vielen Dank.

                  Kommentar

                  Lädt...
                  X